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:
parent
2eff59667d
commit
cb810c48c0
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user