From 760d0ebbe5edaedb60b4de64bde2ad098d1f45d9 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Fri, 13 Aug 2010 16:40:21 +0200 Subject: [PATCH] patch: deal with ommitted ",len" in hunk headers (default len to 1) Signed-off-by: Rob Landley Signed-off-by: Denys Vlasenko --- editors/patch.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/editors/patch.c b/editors/patch.c index 7f3234e66..b12c662f4 100644 --- a/editors/patch.c +++ b/editors/patch.c @@ -227,7 +227,8 @@ struct globals { long prefix; struct double_list *current_hunk; - long oldline, oldlen, newline, newlen, linenum; + long oldline, oldlen, newline, newlen; + long linenum; int context, state, filein, fileout, filepatch, hunknum; char *tempname; @@ -505,14 +506,19 @@ int patch_main(int argc UNUSED_PARAM, char **argv) // way the patch man page says, so you have to read the first hunk // and _guess_. - // Start a new hunk? + // Start a new hunk? Usually @@ -oldline,oldlen +newline,newlen @@ + // but a missing ,value means the value is 1. } else if (state == 1 && !strncmp("@@ -", patchline, 4)) { int i; + char *s = patchline+4; - i = sscanf(patchline+4, "%ld,%ld +%ld,%ld", &TT.oldline, - &TT.oldlen, &TT.newline, &TT.newlen); - if (i != 4) - bb_error_msg_and_die("corrupt hunk %d at %ld", TT.hunknum, TT.linenum); + // Read oldline[,oldlen] +newline[,newlen] + + TT.oldlen = TT.newlen = 1; + TT.oldline = strtol(s, &s, 10); + if (*s == ',') TT.oldlen=strtol(s+1, &s, 10); + TT.newline = strtol(s+2, &s, 10); + if (*s == ',') TT.newlen = strtol(s+1, &s, 10); TT.context = 0; state = 2; @@ -520,7 +526,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv) // If this is the first hunk, open the file. if (TT.filein == -1) { int oldsum, newsum, del = 0; - char *s, *name; + char *name; oldsum = TT.oldline + TT.oldlen; newsum = TT.newline + TT.newlen;