Skip to content

Commit

Permalink
send-pack: segfault fix on forced push
Browse files Browse the repository at this point in the history
When pushing to overwrite a ref that points at a commit we do
not even have, the recent "terse push" patch tried to get a
unique abbreviation for the non-existent (from our point of
view) object, which resulted in strcpy(buf, NULL) and
segfaulted.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Nov 8, 2007
1 parent b50fa2b commit 6738c81
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 2 deletions.
5 changes: 3 additions & 2 deletions builtin-send-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -365,8 +365,9 @@ static int do_send_pack(int in, int out, struct remote *remote, const char *dest
char quickref[83];
char type = ' ';
const char *msg = "";

strcpy(quickref, find_unique_abbrev(ref->old_sha1, DEFAULT_ABBREV));
const char *old_abb;
old_abb = find_unique_abbrev(ref->old_sha1, DEFAULT_ABBREV);
strcpy(quickref, old_abb ? old_abb : old_hex);
if (ref_newer(ref->peer_ref->new_sha1, ref->old_sha1))
strcat(quickref, "..");
else {
Expand Down
42 changes: 42 additions & 0 deletions t/t5405-send-pack-rewind.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/bin/sh

test_description='forced push to replace commit we do not have'

. ./test-lib.sh

test_expect_success setup '
>file1 && git add file1 && test_tick &&
git commit -m Initial &&
mkdir another && (
cd another &&
git init &&
git fetch .. master:master
) &&
>file2 && git add file2 && test_tick &&
git commit -m Second
'

test_expect_success 'non forced push should die not segfault' '
(
cd another &&
git push .. master:master
test $? = 1
)
'

test_expect_success 'forced push should succeed' '
(
cd another &&
git push .. +master:master
)
'

test_done

0 comments on commit 6738c81

Please sign in to comment.