patch: fix matching failure

Fix matching failure when plist is advanced while checking for buffered
lines - the lines in the hunk that are about to be added should be
skipped when checking for matching context.

Also add a valid test case that fails with current busybox and is fixed
by the change.

Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Aaro Koskinen 2016-11-22 00:19:51 +02:00 committed by Denys Vlasenko
parent 2eff59667d
commit cb810c48c0
2 changed files with 56 additions and 0 deletions

View File

@ -290,6 +290,17 @@ static int apply_one_hunk(void)
// out of buffer.
for (;;) {
while (plist && *plist->data == "+-"[reverse]) {
if (!strcmp(check->data, plist->data+1) &&
!backwarn) {
backwarn = TT.linenum;
if (option_mask32 & FLAG_IGNORE) {
dummy_revert = 1;
reverse ^= 1;
}
}
plist = plist->next;
}
if (!plist || strcmp(check->data, plist->data+1)) {
// Match failed. Write out first line of buffered data and
// recheck remaining buffered data for a new match.

View File

@ -242,6 +242,51 @@ patch: can't open 'dir2///file': No such file or directory
zxc
"
testing "patch internal buffering bug?" \
'patch -p1 2>&1; echo $?; cat input' \
"\
patching file input
0
foo
1
2
3
bar
" \
"\
foo
bar
" \
"\
--- a/input.orig
+++ b/input
@@ -5,5 +5,8 @@ foo
+1
+2
+3
bar
--
2.9.2
" \
rm input.orig 2>/dev/null
exit $FAILCOUNT