Skip to content

Commit

Permalink
Fix potential send-pack SIGSEGV
Browse files Browse the repository at this point in the history
The check that the source is ahead of the destination incorrectly expects 
pop_most_recent_commit() to gracefully handle an empty list. 

Fix by just checking the list itself, rather than the return value of the 
pop function.

[jc: I did the test script that demonstrated the problem]

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Linus Torvalds authored and Junio C Hamano committed Jul 27, 2005
1 parent 2779fad commit bdf2514
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 1 deletion.
3 changes: 2 additions & 1 deletion send-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,8 @@ static int ref_newer(const unsigned char *new_sha1, const unsigned char *old_sha
return 0;
list = NULL;
commit_list_insert(new, &list);
while ((new = pop_most_recent_commit(&list, 1)) != NULL) {
while (list) {
new = pop_most_recent_commit(&list, 1);
if (new == old)
return 1;
}
Expand Down
54 changes: 54 additions & 0 deletions t/t5400-send-pack.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano
#

test_description='See why rewinding head breaks send-pack
'
. ./test-lib.sh

cnt='1'
test_expect_success setup '
tree=$(git-write-tree) &&
commit=$(echo "Commit #0" | git-commit-tree $tree) &&
zero=$commit &&
parent=$zero &&
for i in $cnt
do
sleep 1 &&
commit=$(echo "Commit #$i" | git-commit-tree $tree -p $parent) &&
parent=$commit || exit
done &&
echo "$commit" >.git/HEAD &&
git clone -l ./. victim &&
cd victim &&
git log &&
cd .. &&
echo $zero >.git/HEAD &&
parent=$zero &&
for i in $cnt
do
sleep 1 &&
commit=$(echo "Rebase #$i" | git-commit-tree $tree -p $parent) &&
parent=$commit || exit
done &&
echo "$commit" >.git/HEAD &&
echo Rebase &&
git log'

test_expect_success \
'pushing rewound head should not barf but require --force' '
# should not fail but refuse to update.
git-send-pack ./victim/.git/ master &&
if cmp victim/.git/refs/heads/master .git/refs/heads/master
then
# should have been left as it was!
false
else
true
fi &&
# this should update
git-send-pack --force ./victim/.git/ master &&
cmp victim/.git/refs/heads/master .git/refs/heads/master
'

0 comments on commit bdf2514

Please sign in to comment.