]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/block: fix use of uninitialized memory when binsearch fails
authorPatrick Steinhardt <ps@pks.im>
Wed, 24 Jun 2026 08:23:11 +0000 (10:23 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 24 Jun 2026 16:30:25 +0000 (09:30 -0700)
When doing the binary search through our restart offsets we may hit an
error in case `restart_needle_less()` fails to decode the record at the
given offset. While we correctly detect this case and error out, it will
cause us to call `reftable_record_release()` on the yet-uninitialized
record.

Fix this by initializing the record earlier.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
reftable/block.c

index 4d285aefd7b93aacc0bbaa3ead18890f85b7491b..89efce875149525c3a7e0bb161b689db44f452f3 100644 (file)
@@ -517,6 +517,10 @@ int block_iter_seek_key(struct block_iter *it, struct reftable_buf *want)
        int err = 0;
        size_t i;
 
+       err = reftable_record_init(&rec, reftable_block_type(it->block));
+       if (err < 0)
+               goto done;
+
        /*
         * Perform a binary search over the block's restart points, which
         * avoids doing a linear scan over the whole block. Like this, we
@@ -558,10 +562,6 @@ int block_iter_seek_key(struct block_iter *it, struct reftable_buf *want)
        else
                it->next_off = it->block->header_off + 4;
 
-       err = reftable_record_init(&rec, reftable_block_type(it->block));
-       if (err < 0)
-               goto done;
-
        /*
         * We're looking for the last entry less than the wanted key so that
         * the next call to `block_reader_next()` would yield the wanted