Loading ...
Sorry, an error occurred while loading the content.

Patch 7.2.132

Expand Messages
  • Bram Moolenaar
    Patch 7.2.132 Problem: When changing directory during a SwapExists autocmd freed memory may be accessed. (Dominique Pelle) Solution: Add the allbuf_lock
    Message 1 of 1 , Mar 4, 2009
    • 0 Attachment
      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@... -- 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.
      For more information, visit http://www.vim.org/maillist.php
      -~----------~----~----~----~------~----~------~--~---
    Your message has been successfully submitted and would be delivered to recipients shortly.