Browse Source

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 11c8a74a64 (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
7168624c35 (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>
maint
Ævar Arnfjörð Bjarmason 2 years ago committed by Junio C Hamano
parent
commit
03267e8656
  1. 7
      builtin/commit.c
  2. 1
      t/t0068-for-each-repo.sh
  3. 1
      t/t0070-fundamental.sh
  4. 2
      t/t1404-update-ref-errors.sh
  5. 1
      t/t1409-avoid-packing-refs.sh
  6. 1
      t/t1413-reflog-detach.sh
  7. 2
      t/t1501-work-tree.sh
  8. 1
      t/t2025-checkout-no-overlay.sh
  9. 1
      t/t3009-ls-files-others-nonsubmodule.sh
  10. 2
      t/t3010-ls-files-killed-modified.sh
  11. 2
      t/t4045-diff-relative.sh
  12. 1
      t/t4111-apply-subdir.sh
  13. 1
      t/t4135-apply-weird-filenames.sh
  14. 1
      t/t4213-log-tabexpand.sh
  15. 2
      t/t5618-alternate-refs.sh
  16. 1
      t/t6301-for-each-ref-errors.sh
  17. 1
      t/t7520-ignored-hook-warning.sh
  18. 1
      t/t7614-merge-signoff.sh
  19. 2
      t/t9003-help-autocorrect.sh

7
builtin/commit.c

@ -987,8 +987,11 @@ static int prepare_to_commit(const char *index_file, const char *prefix, @@ -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";

1
t/t0068-for-each-repo.sh

@ -2,6 +2,7 @@ @@ -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' '

1
t/t0070-fundamental.sh

@ -6,6 +6,7 @@ test_description='check that the most basic functions work @@ -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.)' '

2
t/t1404-update-ref-errors.sh

@ -1,6 +1,8 @@ @@ -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

1
t/t1409-avoid-packing-refs.sh

@ -2,6 +2,7 @@ @@ -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

1
t/t1413-reflog-detach.sh

@ -4,6 +4,7 @@ test_description='Test reflog interaction with detached HEAD' @@ -4,6 +4,7 @@ test_description='Test reflog interaction with detached HEAD'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

reset_state () {

2
t/t1501-work-tree.sh

@ -1,6 +1,8 @@ @@ -1,6 +1,8 @@
#!/bin/sh

test_description='test separate work tree'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

test_expect_success 'setup' '

1
t/t2025-checkout-no-overlay.sh

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@

test_description='checkout --no-overlay <tree-ish> -- <pathspec>'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

test_expect_success 'setup' '

1
t/t3009-ls-files-others-nonsubmodule.sh

@ -18,6 +18,7 @@ This test runs git ls-files --others with the following working tree: @@ -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' '

2
t/t3010-ls-files-killed-modified.sh

@ -41,6 +41,8 @@ Also for modification test, the cache and working tree have: @@ -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.' '

2
t/t4045-diff-relative.sh

@ -1,6 +1,8 @@ @@ -1,6 +1,8 @@
#!/bin/sh

test_description='diff --relative tests'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

test_expect_success 'setup' '

1
t/t4111-apply-subdir.sh

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@

test_description='patching from inconvenient places'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

test_expect_success 'setup' '

1
t/t4135-apply-weird-filenames.sh

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@

test_description='git apply with weird postimage filenames'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

test_expect_success 'setup' '

1
t/t4213-log-tabexpand.sh

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@

test_description='log/show --expand-tabs'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

HT=" "

2
t/t5618-alternate-refs.sh

@ -1,6 +1,8 @@ @@ -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:

1
t/t6301-for-each-ref-errors.sh

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@

test_description='for-each-ref errors for broken refs'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

ZEROS=$ZERO_OID

1
t/t7520-ignored-hook-warning.sh

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@

test_description='ignored hook warning'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

test_expect_success setup '

1
t/t7614-merge-signoff.sh

@ -8,6 +8,7 @@ This test runs git merge --signoff and makes sure that it works. @@ -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

2
t/t9003-help-autocorrect.sh

@ -1,6 +1,8 @@ @@ -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' '

Loading…
Cancel
Save