]> git.ipfire.org Git - thirdparty/git.git/commitdiff
object-file: fix SEGV on free() regression in v2.34.0-rc2
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Thu, 11 Nov 2021 05:18:55 +0000 (06:18 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 11 Nov 2021 18:41:54 +0000 (10:41 -0800)
Fix a regression introduced in my 96e41f58fe1 (fsck: report invalid
object type-path combinations, 2021-10-01). When fsck-ing blobs larger
than core.bigFileThreshold, we'd free() a pointer to uninitialized
memory.

This issue would have been caught by SANITIZE=address, but since it
involves core.bigFileThreshold, none of the existing tests in our test
suite covered it.

Running them with the "big_file_threshold" in "environment.c" changed
to say "6" would have shown this failure, but let's add a dedicated
test for this scenario based on Han Xin's report[1].

The bug was introduced between v9 and v10[2] of the fsck series merged
in 061a21d36d8 (Merge branch 'ab/fsck-unexpected-type', 2021-10-25).

1. https://lore.kernel.org/git/20211111030302.75694-1-hanxin.hx@alibaba-inc.com/
2. https://lore.kernel.org/git/cover-v10-00.17-00000000000-20211001T091051Z-avarab@gmail.com/

Reported-by: Han Xin <chiyutianyi@gmail.com>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
object-file.c
t/t1050-large.sh

index 4c258703a0554de9727cfe0d898b6c19436e2eda..9213a517213dc289eeed9de0aa5c857dcf1d986a 100644 (file)
@@ -2533,6 +2533,8 @@ int read_loose_object(const char *path,
        char hdr[MAX_HEADER_LEN];
        unsigned long *size = oi->sizep;
 
+       *contents = NULL;
+
        map = map_loose_object_1(the_repository, path, NULL, &mapsize);
        if (!map) {
                error_errno(_("unable to mmap %s"), path);
index 4bab6a513c5c951c084d59a0e6ccd42422f27978..6bc1d76fb108f38f1fdb9a68904c5251866149fb 100755 (executable)
@@ -17,6 +17,14 @@ test_expect_success setup '
        export GIT_ALLOC_LIMIT
 '
 
+test_expect_success 'enter "large" codepath, with small core.bigFileThreshold' '
+       test_when_finished "rm -rf repo" &&
+
+       git init --bare repo &&
+       echo large | git -C repo hash-object -w --stdin &&
+       git -C repo -c core.bigfilethreshold=4 fsck
+'
+
 # add a large file with different settings
 while read expect config
 do