]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.025 v7.3.025
authorBram Moolenaar <Bram@vim.org>
Wed, 13 Oct 2010 15:50:07 +0000 (17:50 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 13 Oct 2010 15:50:07 +0000 (17:50 +0200)
Problem:    ":mksession" does not square brackets escape file name properly.
Solution:   Improve escapging of file names. (partly by Peter Odding)

src/ex_docmd.c
src/version.c

index 0940ad8625502dfa0fc6b4bd4d1127cf783b36cf..fe1bfe74970654b36cc413b1de8d3f93dedca677 100644 (file)
@@ -10708,7 +10708,7 @@ ses_fname(fd, buf, flagp)
  * Write a file name to the session file.
  * Takes care of the "slash" option in 'sessionoptions' and escapes special
  * characters.
- * Returns FAIL if writing fails.
+ * Returns FAIL if writing fails or out of memory.
  */
     static int
 ses_put_fname(fd, name, flagp)
@@ -10717,49 +10717,32 @@ ses_put_fname(fd, name, flagp)
     unsigned   *flagp;
 {
     char_u     *sname;
+    char_u     *p;
     int                retval = OK;
-    int                c;
 
     sname = home_replace_save(NULL, name);
-    if (sname != NULL)
-       name = sname;
-    while (*name != NUL)
-    {
-#ifdef FEAT_MBYTE
-       {
-           int l;
+    if (sname == NULL)
+       return FAIL;
 
-           if (has_mbyte && (l = (*mb_ptr2len)(name)) > 1)
-           {
-               /* copy a multibyte char */
-               while (--l >= 0)
-               {
-                   if (putc(*name, fd) != *name)
-                       retval = FAIL;
-                   ++name;
-               }
-               continue;
-           }
-       }
-#endif
-       c = *name++;
-       if (c == '\\' && (*flagp & SSOP_SLASH))
-           /* change a backslash to a forward slash */
-           c = '/';
-       else if ((vim_strchr(escape_chars, c) != NULL
-#ifdef BACKSLASH_IN_FILENAME
-                   && c != '\\'
-#endif
-                ) || c == '#' || c == '%')
-       {
-           /* escape a special character with a backslash */
-           if (putc('\\', fd) != '\\')
-               retval = FAIL;
-       }
-       if (putc(c, fd) != c)
-           retval = FAIL;
+    if (*flagp & SSOP_SLASH)
+    {
+       /* change all backslashes to forward slashes */
+       for (p = sname; *p != NUL; mb_ptr_adv(p))
+           if (*p == '\\')
+               *p = '/';
     }
+
+    /* escapse special characters */
+    p = vim_strsave_fnameescape(sname, FALSE);
     vim_free(sname);
+    if (p == NULL)
+       return FAIL;
+
+    /* write the result */
+    if (fputs((char *)p, fd) < 0)
+       retval = FAIL;
+
+    vim_free(p);
     return retval;
 }
 
index 882f9a14ec6d54365c52e4369b74d81ae1cc4e08..9959c79d3aad0d2a5dd67df465c01b749885f2e2 100644 (file)
@@ -714,6 +714,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    25,
 /**/
     24,
 /**/