Patch 7.3.025
Problem:    ":mksession" does not square brackets escape file name properly.
Solution:   Improve escapging of file names. (partly by Peter Odding)
Files:      src/ex_docmd.c


*** ../vim-7.3.024/src/ex_docmd.c       2010-09-21 16:56:29.000000000 +0200
--- src/ex_docmd.c      2010-10-13 17:39:17.000000000 +0200
***************
*** 10708,10714 ****
   * 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.
   */
      static int
  ses_put_fname(fd, name, flagp)
--- 10708,10714 ----
   * 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 or out of memory.
   */
      static int
  ses_put_fname(fd, name, flagp)
***************
*** 10717,10765 ****
      unsigned  *flagp;
  {
      char_u    *sname;
      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 (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;
      }
      vim_free(sname);
      return retval;
  }
  
--- 10717,10748 ----
      unsigned  *flagp;
  {
      char_u    *sname;
+     char_u    *p;
      int               retval = OK;
  
      sname = home_replace_save(NULL, name);
!     if (sname == NULL)
!       return 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;
  }
  
*** ../vim-7.3.024/src/version.c        2010-10-13 16:44:17.000000000 +0200
--- src/version.c       2010-10-13 17:49:15.000000000 +0200
***************
*** 716,717 ****
--- 716,719 ----
  {   /* Add new patch number below this line */
+ /**/
+     25,
  /**/

-- 
"Time flies like an arrow".  So I put an arrow on my desk, now
awaiting one of these time flies showing up.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui