commit: discard partial cache before (re-)reading it
The read_cache() in prepare_to_commit() would end up clobbering the
pointer we had for a previously populated "the_index.cache_tree" in
the very common case of "git commit" stressed by e.g. the tests being
changed here.
We'd populate "the_index.cache_tree" by calling
"update_main_cache_tree" in prepare_index(), but would not end up with
a "fully prepared" index. What constitutes an existing index is
clearly overly fuzzy, here we'll check "active_nr" (aka
"the_index.cache_nr"), but our "the_index.cache_tree" might have been
malloc()'d already.
Thus the code added in 11c8a74a64a (commit: write cache-tree data when
writing index anyway, 2011-12-06) would end up allocating the
"cache_tree", and would interact here with code added in
7168624c353 (Do not generate full commit log message if it is not
going to be used, 2007-11-28). The result was a very common memory
leak.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Ævar Arnfjörð Bjarmason committedNov 8, 2022 at 19:17 UTC03267e8656c23cf1e2d1df8204d4cee236fb0077
19 files changed+29-2
builtin/commit.c
+5-2
index e22bdf23f5..c291199b70 100644--- a/builtin/commit.c+++ b/builtin/commit.c@@ -987,8 +987,11 @@ static int prepare_to_commit(const char *index_file, const char *prefix, struct object_id oid; const char *parent = "HEAD";- if (!active_nr && read_cache() < 0)- die(_("Cannot read index"));+ if (!active_nr) {+ discard_cache();+ if (read_cache() < 0)+ die(_("Cannot read index"));+ } if (amend) parent = "HEAD^1";
t/t0068-for-each-repo.sh
+1
index 4675e85251..9f63f61242 100755--- a/t/t0068-for-each-repo.sh+++ b/t/t0068-for-each-repo.sh@@ -2,6 +2,7 @@ test_description='git for-each-repo builtin'+TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh test_expect_success 'run based on configured value' '
t/t0070-fundamental.sh
+1
index 8d59905ef0..574de34198 100755--- a/t/t0070-fundamental.sh+++ b/t/t0070-fundamental.sh@@ -6,6 +6,7 @@ test_description='check that the most basic functions work Verify wrappers and compatibility functions. '+TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh test_expect_success 'character classes (isspace, isalpha etc.)' '
t/t1404-update-ref-errors.sh
+2
index 13c2b43bba..b5606d93b5 100755--- a/t/t1404-update-ref-errors.sh+++ b/t/t1404-update-ref-errors.sh@@ -1,6 +1,8 @@ #!/bin/sh test_description='Test git update-ref error handling'++TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh # Create some references, perhaps run pack-refs --all, then try to
t/t1409-avoid-packing-refs.sh
+1
index be12fb6350..f23c0152a8 100755--- a/t/t1409-avoid-packing-refs.sh+++ b/t/t1409-avoid-packing-refs.sh@@ -2,6 +2,7 @@ test_description='avoid rewriting packed-refs unnecessarily'+TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh # Add an identifying mark to the packed-refs file header line. This
index 963f3462b7..14218b3424 100755--- a/t/t3009-ls-files-others-nonsubmodule.sh+++ b/t/t3009-ls-files-others-nonsubmodule.sh@@ -18,6 +18,7 @@ This test runs git ls-files --others with the following working tree: git repository with a commit and an untracked file '+TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh test_expect_success 'setup: directories' '
t/t3010-ls-files-killed-modified.sh
+2
index 580e158f99..054178703d 100755--- a/t/t3010-ls-files-killed-modified.sh+++ b/t/t3010-ls-files-killed-modified.sh@@ -41,6 +41,8 @@ Also for modification test, the cache and working tree have: We should report path0, path1, path2/file2, path3/file3, path7 and path8 modified without reporting path9 and path10. submod1 is also modified. '++TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh test_expect_success 'git update-index --add to add various paths.' '
index 3353216f09..f905db0a3f 100755--- a/t/t5618-alternate-refs.sh+++ b/t/t5618-alternate-refs.sh@@ -1,6 +1,8 @@ #!/bin/sh test_description='test handling of --alternate-refs traversal'++TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh # Avoid test_commit because we want a specific and known set of refs:
t/t6301-for-each-ref-errors.sh
+1
index 40edf9dab5..bfda1f46ad 100755--- a/t/t6301-for-each-ref-errors.sh+++ b/t/t6301-for-each-ref-errors.sh@@ -2,6 +2,7 @@ test_description='for-each-ref errors for broken refs'+TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh ZEROS=$ZERO_OID
index fee258d4f0..cf96a35e8e 100755--- a/t/t7614-merge-signoff.sh+++ b/t/t7614-merge-signoff.sh@@ -8,6 +8,7 @@ This test runs git merge --signoff and makes sure that it works. GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME+TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh # Setup test files
t/t9003-help-autocorrect.sh
+2
index f00deaf381..4b9cb4c942 100755--- a/t/t9003-help-autocorrect.sh+++ b/t/t9003-help-autocorrect.sh@@ -1,6 +1,8 @@ #!/bin/sh test_description='help.autocorrect finding a match'++TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh test_expect_success 'setup' '