]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/block: check deflateInit() return value
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Tue, 14 Jul 2026 22:48:36 +0000 (22:48 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 15 Jul 2026 01:02:00 +0000 (18:02 -0700)
block_writer_init() allocates a z_stream and calls deflateInit()
to prepare it for compressing log records. The return value of
deflateInit() is silently discarded. If zlib initialization fails
(e.g., Z_MEM_ERROR when the system is under memory pressure), the
z_stream is left in an undefined state.

Subsequent deflate() calls in block_writer_finish() then operate
on this uninitialized stream. Depending on the zlib
implementation, this can produce silently corrupted compressed
data (which would be written to the reftable file and discovered
only when a later reader fails to inflate) or crash outright.

The function already uses REFTABLE_ZLIB_ERROR for deflate()
failures later in the code path (lines 171, 199), so returning
the same error code for deflateInit() failure is consistent.

Pointed out by Coverity.

Assisted-by: Claude Opus 4.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
reftable/block.c

index 920b3f448674f1c54dd3335f185e5c7f861394b6..ec81fd049383362c25e196476fd47e1272c38046 100644 (file)
@@ -87,7 +87,8 @@ int block_writer_init(struct block_writer *bw, uint8_t typ, uint8_t *block,
                REFTABLE_CALLOC_ARRAY(bw->zstream, 1);
                if (!bw->zstream)
                        return REFTABLE_OUT_OF_MEMORY_ERROR;
-               deflateInit(bw->zstream, 9);
+               if (deflateInit(bw->zstream, 9) != Z_OK)
+                       return REFTABLE_ZLIB_ERROR;
        }
 
        return 0;