diff --git a/7.3.025 b/7.3.025 new file mode 100644 index 0000000..0fb3bee --- /dev/null +++ b/7.3.025 @@ -0,0 +1,136 @@ +To: vim-dev@vim.org +Subject: Patch 7.3.025 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +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 -- Bram@Moolenaar.net -- 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 ///