diff options
Diffstat (limited to 'source/ap/vim/patches/7.2.132')
-rw-r--r-- | source/ap/vim/patches/7.2.132 | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/source/ap/vim/patches/7.2.132 b/source/ap/vim/patches/7.2.132 new file mode 100644 index 00000000..69e19ee4 --- /dev/null +++ b/source/ap/vim/patches/7.2.132 @@ -0,0 +1,268 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.132 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.132 +Problem: When changing directory during a SwapExists autocmd freed memory + may be accessed. (Dominique Pelle) +Solution: Add the allbuf_lock flag. +Files: src/ex_getln.c, src/globals.h, src/fileio.c, + src/proto/ex_getln.pro + + +*** ../vim-7.2.131/src/ex_getln.c Mon Mar 2 02:11:09 2009 +--- src/ex_getln.c Mon Mar 2 00:53:39 2009 +*************** +*** 2000,2007 **** + + #if defined(FEAT_AUTOCMD) || defined(PROTO) + /* +! * Check if "curbuf_lock" is set and return TRUE when it is and give an error +! * message. + */ + int + curbuf_locked() +--- 2000,2007 ---- + + #if defined(FEAT_AUTOCMD) || defined(PROTO) + /* +! * Check if "curbuf_lock" or "allbuf_lock" is set and return TRUE when it is +! * and give an error message. + */ + int + curbuf_locked() +*************** +*** 2011,2016 **** +--- 2011,2031 ---- + EMSG(_("E788: Not allowed to edit another buffer now")); + return TRUE; + } ++ return allbuf_locked(); ++ } ++ ++ /* ++ * Check if "allbuf_lock" is set and return TRUE when it is and give an error ++ * message. ++ */ ++ int ++ allbuf_locked() ++ { ++ if (allbuf_lock > 0) ++ { ++ EMSG(_("E811: Not allowed to change buffer information now")); ++ return TRUE; ++ } + return FALSE; + } + #endif +*** ../vim-7.2.131/src/globals.h Mon Mar 2 02:44:54 2009 +--- src/globals.h Mon Mar 2 02:40:16 2009 +*************** +*** 619,624 **** +--- 619,629 ---- + EXTERN int curbuf_lock INIT(= 0); + /* non-zero when the current buffer can't be + * changed. Used for FileChangedRO. */ ++ EXTERN int allbuf_lock INIT(= 0); ++ /* non-zero when no buffer name can be ++ * changed, no buffer can be deleted and ++ * current directory can't be changed. ++ * Used for SwapExists et al. */ + #endif + #ifdef FEAT_EVAL + # define HAVE_SANDBOX +*** ../vim-7.2.131/src/fileio.c Wed Dec 31 16:20:54 2008 +--- src/fileio.c Sun Mar 1 23:37:10 2009 +*************** +*** 69,75 **** + static int au_find_group __ARGS((char_u *name)); + + # define AUGROUP_DEFAULT -1 /* default autocmd group */ +! # define AUGROUP_ERROR -2 /* errornouse autocmd group */ + # define AUGROUP_ALL -3 /* all autocmd groups */ + #endif + +--- 69,75 ---- + static int au_find_group __ARGS((char_u *name)); + + # define AUGROUP_DEFAULT -1 /* default autocmd group */ +! # define AUGROUP_ERROR -2 /* erroneous autocmd group */ + # define AUGROUP_ALL -3 /* all autocmd groups */ + #endif + +*************** +*** 144,150 **** + # endif + #endif + static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf)); +! + + void + filemess(buf, name, s, attr) +--- 144,152 ---- + # endif + #endif + static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf)); +! #ifdef FEAT_AUTOCMD +! static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name"); +! #endif + + void + filemess(buf, name, s, attr) +*************** +*** 295,300 **** +--- 297,315 ---- + int conv_restlen = 0; /* nr of bytes in conv_rest[] */ + #endif + ++ #ifdef FEAT_AUTOCMD ++ /* Remember the initial values of curbuf, curbuf->b_ffname and ++ * curbuf->b_fname to detect whether they are altered as a result of ++ * executing nasty autocommands. Also check if "fname" and "sfname" ++ * point to one of these values. */ ++ buf_T *old_curbuf = curbuf; ++ char_u *old_b_ffname = curbuf->b_ffname; ++ char_u *old_b_fname = curbuf->b_fname; ++ int using_b_ffname = (fname == curbuf->b_ffname) ++ || (sfname == curbuf->b_ffname); ++ int using_b_fname = (fname == curbuf->b_fname) ++ || (sfname == curbuf->b_fname); ++ #endif + write_no_eol_lnum = 0; /* in case it was set by the previous read */ + + /* +*************** +*** 589,595 **** +--- 604,624 ---- + #ifdef FEAT_QUICKFIX + if (!bt_dontwrite(curbuf)) + #endif ++ { + check_need_swap(newfile); ++ #ifdef FEAT_AUTOCMD ++ /* SwapExists autocommand may mess things up */ ++ if (curbuf != old_curbuf ++ || (using_b_ffname ++ && (old_b_ffname != curbuf->b_ffname)) ++ || (using_b_fname ++ && (old_b_fname != curbuf->b_fname))) ++ { ++ EMSG(_(e_auchangedbuf)); ++ return FAIL; ++ } ++ #endif ++ } + if (dir_of_file_exists(fname)) + filemess(curbuf, sfname, (char_u *)_("[New File]"), 0); + else +*************** +*** 668,673 **** +--- 697,713 ---- + #endif + { + check_need_swap(newfile); ++ #ifdef FEAT_AUTOCMD ++ if (!read_stdin && (curbuf != old_curbuf ++ || (using_b_ffname && (old_b_ffname != curbuf->b_ffname)) ++ || (using_b_fname && (old_b_fname != curbuf->b_fname)))) ++ { ++ EMSG(_(e_auchangedbuf)); ++ if (!read_buffer) ++ close(fd); ++ return FAIL; ++ } ++ #endif + #ifdef UNIX + /* Set swap file protection bits after creating it. */ + if (swap_mode > 0 && curbuf->b_ml.ml_mfp->mf_fname != NULL) +*************** +*** 698,704 **** + { + int m = msg_scroll; + int n = msg_scrolled; +- buf_T *old_curbuf = curbuf; + + /* + * The file must be closed again, the autocommands may want to change +--- 738,743 ---- +*************** +*** 740,747 **** +--- 779,791 ---- + /* + * Don't allow the autocommands to change the current buffer. + * Try to re-open the file. ++ * ++ * Don't allow the autocommands to change the buffer name either ++ * (cd for example) if it invalidates fname or sfname. + */ + if (!read_stdin && (curbuf != old_curbuf ++ || (using_b_ffname && (old_b_ffname != curbuf->b_ffname)) ++ || (using_b_fname && (old_b_fname != curbuf->b_fname)) + || (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0)) + { + --no_wait_return; +*************** +*** 6320,6326 **** + + if (!stuff_empty() || global_busy || !typebuf_typed() + #ifdef FEAT_AUTOCMD +! || autocmd_busy || curbuf_lock > 0 + #endif + ) + need_check_timestamps = TRUE; /* check later */ +--- 6364,6370 ---- + + if (!stuff_empty() || global_busy || !typebuf_typed() + #ifdef FEAT_AUTOCMD +! || autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0 + #endif + ) + need_check_timestamps = TRUE; /* check later */ +*************** +*** 6522,6529 **** +--- 6566,6575 ---- + set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1); + set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1); + # endif ++ ++allbuf_lock; + n = apply_autocmds(EVENT_FILECHANGEDSHELL, + buf->b_fname, buf->b_fname, FALSE, buf); ++ --allbuf_lock; + busy = FALSE; + if (n) + { +*** ../vim-7.2.131/src/proto/ex_getln.pro Fri Nov 28 10:59:57 2008 +--- src/proto/ex_getln.pro Sun Mar 1 00:27:12 2009 +*************** +*** 4,9 **** +--- 4,10 ---- + int text_locked __ARGS((void)); + void text_locked_msg __ARGS((void)); + int curbuf_locked __ARGS((void)); ++ int allbuf_locked __ARGS((void)); + char_u *getexline __ARGS((int c, void *dummy, int indent)); + char_u *getexmodeline __ARGS((int promptc, void *dummy, int indent)); + int cmdline_overstrike __ARGS((void)); +*** ../vim-7.2.131/src/version.c Wed Mar 4 04:11:56 2009 +--- src/version.c Thu Mar 5 03:08:54 2009 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 132, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +168. You have your own domain name. + + /// 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 /// |