]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/stack: guard against NULL list_file in stack_destroy
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Fri, 10 Jul 2026 11:39:28 +0000 (11:39 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 10 Jul 2026 15:13:54 +0000 (08:13 -0700)
When reftable_new_stack() fails partway through initialization
(e.g., reftable_buf_addstr returns an OOM error before
reftable_buf_detach assigns p->list_file), it jumps to the error
path which calls reftable_stack_destroy(p). At that point,
p->list_file is still NULL because the detach never happened.

reftable_stack_destroy() passes st->list_file unconditionally to
read_lines(), which calls open(filename, O_RDONLY). Passing NULL
to open() is undefined behavior and will typically crash.

Guard the read_lines() call with a NULL check on st->list_file.
When list_file is NULL, there are no table files to clean up
anyway, so skipping read_lines is the correct behavior.

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/stack.c

index ab129267089f29a58a8b555c85bc03dd8601277f..c052b211fafc651e2aa5b914824d61eed711f208 100644 (file)
@@ -171,7 +171,8 @@ void reftable_stack_destroy(struct reftable_stack *st)
                st->merged = NULL;
        }
 
-       err = read_lines(st->list_file, &names);
+       if (st->list_file)
+               err = read_lines(st->list_file, &names);
        if (err < 0) {
                REFTABLE_FREE_AND_NULL(names);
        }