]> granicus.if.org Git - vim/commitdiff
patch 8.0.0444: diffpatch fails when the file name has a quote v8.0.0444
authorBram Moolenaar <Bram@vim.org>
Sat, 11 Mar 2017 18:21:53 +0000 (19:21 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 11 Mar 2017 18:21:53 +0000 (19:21 +0100)
Problem:    Diffpatch fails when the file name has a quote.
Solution:   Escape the name properly. (zetzei)

src/diff.c
src/testdir/test_diffmode.vim
src/version.c

index 7b81feba7aa59359ea00137b12c3a83aa27e6d30..435269984e642648a34bbe33a73b9607333a25c2 100644 (file)
@@ -906,6 +906,7 @@ ex_diffpatch(exarg_T *eap)
     int                browse_flag = cmdmod.browse;
 #endif
     stat_T     st;
+    char_u     *esc_name = NULL;
 
 #ifdef FEAT_BROWSE
     if (cmdmod.browse)
@@ -935,11 +936,14 @@ ex_diffpatch(exarg_T *eap)
     /* Get the absolute path of the patchfile, changing directory below. */
     fullname = FullName_save(eap->arg, FALSE);
 #endif
-    buflen = STRLEN(tmp_orig) + (
+    esc_name = vim_strsave_shellescape(
 # ifdef UNIX
-                   fullname != NULL ? STRLEN(fullname) :
+                   fullname != NULL ? fullname :
 # endif
-                   STRLEN(eap->arg)) + STRLEN(tmp_new) + 16;
+                   eap->arg, TRUE, TRUE);
+    if (esc_name == NULL)
+       goto theend;
+    buflen = STRLEN(tmp_orig) + STRLEN(esc_name) + STRLEN(tmp_new) + 16;
     buf = alloc((unsigned)buflen);
     if (buf == NULL)
        goto theend;
@@ -977,17 +981,8 @@ ex_diffpatch(exarg_T *eap)
     {
        /* Build the patch command and execute it.  Ignore errors.  Switch to
         * cooked mode to allow the user to respond to prompts. */
-       vim_snprintf((char *)buf, buflen,
-#ifdef UNIX
-               "patch -o %s %s < '%s'",
-#else
-               "patch -o %s %s < \"%s\"",
-#endif
-               tmp_new, tmp_orig,
-# ifdef UNIX
-               fullname != NULL ? fullname :
-# endif
-               eap->arg);
+       vim_snprintf((char *)buf, buflen, "patch -o %s %s < %s",
+                                                 tmp_new, tmp_orig, esc_name);
 #ifdef FEAT_AUTOCMD
        block_autocmds();       /* Avoid ShellCmdPost stuff */
 #endif
@@ -1078,6 +1073,7 @@ theend:
 #ifdef UNIX
     vim_free(fullname);
 #endif
+    vim_free(esc_name);
 #ifdef FEAT_BROWSE
     vim_free(browseFile);
     cmdmod.browse = browse_flag;
index c23e8a1da5b56d59746fcc5d73e4f49b7ebf5699..e09bcaa44fbd04765925e27cc9b0b1357e6ea7a7 100644 (file)
@@ -319,7 +319,7 @@ func Test_diffpatch()
   new
   call assert_fails('diffpatch Xpatch', 'E816:')
 
-  for name in ['Xpatch', 'Xpatch$HOME']
+  for name in ['Xpatch', 'Xpatch$HOME', 'Xpa''tch']
     call setline(1, ['1', '2', '3'])
     if name != 'Xpatch'
       call rename('Xpatch', name)
index 5a58f4317c36ac482d86703dd43b595e15d97c21..db00cc7d238a8a72171817533fc355fbee9a1298 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    444,
 /**/
     443,
 /**/