Skip to content

Commit

Permalink
git-apply: do not read past the end of buffer
Browse files Browse the repository at this point in the history
When the preimage we are patching is shorter than what the patch
text expects, we tried to match the buffer contents at the
"original" line with the fragment in full, without checking we
have enough data to match in the preimage.  This caused the size
of a later memmove() to wrap around and attempt to scribble
almost the entire address space.  Not good.

The code that follows the part this patch touches tries to match
the fragment with line offsets.  Curiously, that code does not
have the problem --- it guards against reading past the end of
the preimage.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Sep 6, 2007
1 parent 5587cac commit 6b763c4
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 1 deletion.
3 changes: 2 additions & 1 deletion builtin-apply.c
Original file line number Diff line number Diff line change
Expand Up @@ -1514,7 +1514,8 @@ static int find_offset(const char *buf, unsigned long size, const char *fragment
}

/* Exact line number? */
if (!memcmp(buf + start, fragment, fragsize))
if ((start + fragsize <= size) &&
!memcmp(buf + start, fragment, fragsize))
return start;

/*
Expand Down
58 changes: 58 additions & 0 deletions t/t4123-apply-shrink.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#!/bin/sh

test_description='apply a patch that is larger than the preimage'

. ./test-lib.sh

cat >F <<\EOF
1
2
3
4
5
6
7
8
999999
A
B
C
D
E
F
G
H
I
J
EOF

test_expect_success setup '
git add F &&
mv F G &&
sed -e "s/1/11/" -e "s/999999/9/" -e "s/H/HH/" <G >F &&
git diff >patch &&
sed -e "/^\$/d" <G >F &&
git add F
'

test_expect_success 'apply should fail gracefully' '
if git apply --index patch
then
echo Oops, should not have succeeded
false
else
status=$?
echo "Status was $status"
if test -f .git/index.lock
then
echo Oops, should not have crashed
false
fi
fi
'

test_done

0 comments on commit 6b763c4

Please sign in to comment.