diff options
author | Jonathan Nieder <jrnieder@gmail.com> | 2011-08-14 10:22:04 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-08-16 10:51:34 -0700 |
commit | 127f04522292fc62152762405c92d6acca4dbcb5 (patch) | |
tree | 799a8c1b30f8032e1e7e00c4358ee4c7c8d7b52c /t/t3503-cherry-pick-root.sh | |
parent | 86c7bb47c76948bd1240a0db5b8dd88cf9db855d (diff) | |
download | git-127f04522292fc62152762405c92d6acca4dbcb5.tar.gz |
revert: plug memory leak in "cherry-pick root commit" codepath
The empty tree passed as common ancestor to merge_trees() when
cherry-picking a parentless commit is allocated on the heap and never
freed. Leaking such a small one-time allocation is not a very big
problem, but now that "git cherry-pick" can cherry-pick multiple
commits it can start to add up.
Avoid the leak by storing the fake tree exactly once in the BSS
section (i.e., use a static). While at it, let's add a test to make
sure cherry-picking multiple parentless commits continues to work.
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't/t3503-cherry-pick-root.sh')
-rwxr-xr-x | t/t3503-cherry-pick-root.sh | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/t/t3503-cherry-pick-root.sh b/t/t3503-cherry-pick-root.sh index b0faa29918..472e5b80d7 100755 --- a/t/t3503-cherry-pick-root.sh +++ b/t/t3503-cherry-pick-root.sh @@ -16,15 +16,40 @@ test_expect_success setup ' echo second > file2 && git add file2 && test_tick && - git commit -m "second" + git commit -m "second" && + + git symbolic-ref HEAD refs/heads/third && + rm .git/index file2 && + echo third > file3 && + git add file3 && + test_tick && + git commit -m "third" ' test_expect_success 'cherry-pick a root commit' ' + git checkout second^0 && git cherry-pick master && test first = $(cat file1) ' +test_expect_success 'cherry-pick two root commits' ' + + echo first >expect.file1 && + echo second >expect.file2 && + echo third >expect.file3 && + + git checkout second^0 && + git cherry-pick master third && + + test_cmp expect.file1 file1 && + test_cmp expect.file2 file2 && + test_cmp expect.file3 file3 && + git rev-parse --verify HEAD^^ && + test_must_fail git rev-parse --verify HEAD^^^ + +' + test_done |