patch: segfault fix. Closes 7916
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 11 Mar 2015 17:01:34 +0000 (18:01 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 11 Mar 2015 17:01:34 +0000 (18:01 +0100)
Fix segfault on this case (malformed --- line):

    -- dwarves.orig 2015-02-25 01:45:27.753000000 +0000
    +++ dwarves     2015-02-25 01:46:08.199000000 +0000
    @@ -1,7 +1,7 @@
     Bashful
     Doc
     Dopey
    -Grouchy
    +Grumpy
     Happy
     Sleepy
     Sneezy

function                                             old     new   delta
patch_main                                          1903    1957     +54

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/patch.c

index 13785ef460ab45821ac6451119255707709b1a21..f8606754460fb9d2281ce9aac76673db4511c0ee 100644 (file)
@@ -345,6 +345,8 @@ done:
 // state 1: Found +++ file indicator, look for @@
 // state 2: In hunk: counting initial context lines
 // state 3: In hunk: getting body
+// Like GNU patch, we don't require a --- line before the +++, and
+// also allow the --- after the +++ line.
 
 int patch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int patch_main(int argc UNUSED_PARAM, char **argv)
@@ -462,6 +464,14 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
                        TT.context = 0;
                        state = 2;
 
+                       // If the --- line is missing or malformed, either oldname
+                       // or (for -R) newname could be NULL -- but not both.  Like
+                       // GNU patch, proceed based on the +++ line, and avoid SEGVs.
+                       if (!oldname)
+                               oldname = xstrdup("MISSING_FILENAME");
+                       if (!newname)
+                               newname = xstrdup("MISSING_FILENAME");
+
                        // If this is the first hunk, open the file.
                        if (TT.filein == -1) {
                                int oldsum, newsum, empty = 0;