home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / patches / 7.2 / 7.2.132 < prev    next >
Encoding:
Internet Message Format  |  2009-03-04  |  7.6 KB

  1. To: vim-dev@vim.org
  2. Subject: Patch 7.2.132
  3. Fcc: outbox
  4. From: Bram Moolenaar <Bram@moolenaar.net>
  5. Mime-Version: 1.0
  6. Content-Type: text/plain; charset=ISO-8859-1
  7. Content-Transfer-Encoding: 8bit
  8. ------------
  9.  
  10. Patch 7.2.132
  11. Problem:    When changing directory during a SwapExists autocmd freed memory
  12.             may be accessed. (Dominique Pelle)
  13. Solution:   Add the allbuf_lock flag.
  14. Files:      src/ex_getln.c, src/globals.h, src/fileio.c,
  15.             src/proto/ex_getln.pro
  16.     
  17.  
  18. *** ../vim-7.2.131/src/ex_getln.c    Mon Mar  2 02:11:09 2009
  19. --- src/ex_getln.c    Mon Mar  2 00:53:39 2009
  20. ***************
  21. *** 2000,2007 ****
  22.   
  23.   #if defined(FEAT_AUTOCMD) || defined(PROTO)
  24.   /*
  25. !  * Check if "curbuf_lock" is set and return TRUE when it is and give an error
  26. !  * message.
  27.    */
  28.       int
  29.   curbuf_locked()
  30. --- 2000,2007 ----
  31.   
  32.   #if defined(FEAT_AUTOCMD) || defined(PROTO)
  33.   /*
  34. !  * Check if "curbuf_lock" or "allbuf_lock" is set and return TRUE when it is
  35. !  * and give an error message.
  36.    */
  37.       int
  38.   curbuf_locked()
  39. ***************
  40. *** 2011,2016 ****
  41. --- 2011,2031 ----
  42.       EMSG(_("E788: Not allowed to edit another buffer now"));
  43.       return TRUE;
  44.       }
  45. +     return allbuf_locked();
  46. + }
  47. + /*
  48. +  * Check if "allbuf_lock" is set and return TRUE when it is and give an error
  49. +  * message.
  50. +  */
  51. +     int
  52. + allbuf_locked()
  53. + {
  54. +     if (allbuf_lock > 0)
  55. +     {
  56. +     EMSG(_("E811: Not allowed to change buffer information now"));
  57. +     return TRUE;
  58. +     }
  59.       return FALSE;
  60.   }
  61.   #endif
  62. *** ../vim-7.2.131/src/globals.h    Mon Mar  2 02:44:54 2009
  63. --- src/globals.h    Mon Mar  2 02:40:16 2009
  64. ***************
  65. *** 619,624 ****
  66. --- 619,629 ----
  67.   EXTERN int    curbuf_lock INIT(= 0);
  68.                   /* non-zero when the current buffer can't be
  69.                    * changed.  Used for FileChangedRO. */
  70. + EXTERN int    allbuf_lock INIT(= 0);
  71. +                 /* non-zero when no buffer name can be
  72. +                  * changed, no buffer can be deleted and
  73. +                  * current directory can't be changed.
  74. +                  * Used for SwapExists et al. */
  75.   #endif
  76.   #ifdef FEAT_EVAL
  77.   # define HAVE_SANDBOX
  78. *** ../vim-7.2.131/src/fileio.c    Wed Dec 31 16:20:54 2008
  79. --- src/fileio.c    Sun Mar  1 23:37:10 2009
  80. ***************
  81. *** 69,75 ****
  82.   static int au_find_group __ARGS((char_u *name));
  83.   
  84.   # define AUGROUP_DEFAULT    -1        /* default autocmd group */
  85. ! # define AUGROUP_ERROR        -2        /* errornouse autocmd group */
  86.   # define AUGROUP_ALL        -3        /* all autocmd groups */
  87.   #endif
  88.   
  89. --- 69,75 ----
  90.   static int au_find_group __ARGS((char_u *name));
  91.   
  92.   # define AUGROUP_DEFAULT    -1        /* default autocmd group */
  93. ! # define AUGROUP_ERROR        -2        /* erroneous autocmd group */
  94.   # define AUGROUP_ALL        -3        /* all autocmd groups */
  95.   #endif
  96.   
  97. ***************
  98. *** 144,150 ****
  99.   # endif
  100.   #endif
  101.   static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
  102.   
  103.       void
  104.   filemess(buf, name, s, attr)
  105. --- 144,152 ----
  106.   # endif
  107.   #endif
  108.   static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
  109. ! #ifdef FEAT_AUTOCMD
  110. ! static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
  111. ! #endif
  112.   
  113.       void
  114.   filemess(buf, name, s, attr)
  115. ***************
  116. *** 295,300 ****
  117. --- 297,315 ----
  118.       int        conv_restlen = 0;    /* nr of bytes in conv_rest[] */
  119.   #endif
  120.   
  121. + #ifdef FEAT_AUTOCMD
  122. +     /* Remember the initial values of curbuf, curbuf->b_ffname and
  123. +      * curbuf->b_fname to detect whether they are altered as a result of
  124. +      * executing nasty autocommands.  Also check if "fname" and "sfname"
  125. +      * point to one of these values. */
  126. +     buf_T   *old_curbuf = curbuf;
  127. +     char_u  *old_b_ffname = curbuf->b_ffname;
  128. +     char_u  *old_b_fname = curbuf->b_fname;
  129. +     int     using_b_ffname = (fname == curbuf->b_ffname)
  130. +                           || (sfname == curbuf->b_ffname);
  131. +     int     using_b_fname = (fname == curbuf->b_fname)
  132. +                            || (sfname == curbuf->b_fname);
  133. + #endif
  134.       write_no_eol_lnum = 0;    /* in case it was set by the previous read */
  135.   
  136.       /*
  137. ***************
  138. *** 589,595 ****
  139. --- 604,624 ----
  140.   #ifdef FEAT_QUICKFIX
  141.               if (!bt_dontwrite(curbuf))
  142.   #endif
  143. +             {
  144.               check_need_swap(newfile);
  145. + #ifdef FEAT_AUTOCMD
  146. +             /* SwapExists autocommand may mess things up */
  147. +             if (curbuf != old_curbuf
  148. +                 || (using_b_ffname
  149. +                     && (old_b_ffname != curbuf->b_ffname))
  150. +                 || (using_b_fname
  151. +                      && (old_b_fname != curbuf->b_fname)))
  152. +             {
  153. +                 EMSG(_(e_auchangedbuf));
  154. +                 return FAIL;
  155. +             }
  156. + #endif
  157. +             }
  158.               if (dir_of_file_exists(fname))
  159.               filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
  160.               else
  161. ***************
  162. *** 668,673 ****
  163. --- 697,713 ----
  164.   #endif
  165.       {
  166.       check_need_swap(newfile);
  167. + #ifdef FEAT_AUTOCMD
  168. +     if (!read_stdin && (curbuf != old_curbuf
  169. +         || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
  170. +         || (using_b_fname && (old_b_fname != curbuf->b_fname))))
  171. +     {
  172. +         EMSG(_(e_auchangedbuf));
  173. +         if (!read_buffer)
  174. +         close(fd);
  175. +         return FAIL;
  176. +     }
  177. + #endif
  178.   #ifdef UNIX
  179.       /* Set swap file protection bits after creating it. */
  180.       if (swap_mode > 0 && curbuf->b_ml.ml_mfp->mf_fname != NULL)
  181. ***************
  182. *** 698,704 ****
  183.       {
  184.       int    m = msg_scroll;
  185.       int    n = msg_scrolled;
  186. -     buf_T    *old_curbuf = curbuf;
  187.   
  188.       /*
  189.        * The file must be closed again, the autocommands may want to change
  190. --- 738,743 ----
  191. ***************
  192. *** 740,747 ****
  193. --- 779,791 ----
  194.       /*
  195.        * Don't allow the autocommands to change the current buffer.
  196.        * Try to re-open the file.
  197. +      *
  198. +      * Don't allow the autocommands to change the buffer name either
  199. +      * (cd for example) if it invalidates fname or sfname.
  200.        */
  201.       if (!read_stdin && (curbuf != old_curbuf
  202. +         || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
  203. +         || (using_b_fname && (old_b_fname != curbuf->b_fname))
  204.           || (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0))
  205.       {
  206.           --no_wait_return;
  207. ***************
  208. *** 6320,6326 ****
  209.   
  210.       if (!stuff_empty() || global_busy || !typebuf_typed()
  211.   #ifdef FEAT_AUTOCMD
  212. !             || autocmd_busy || curbuf_lock > 0
  213.   #endif
  214.                       )
  215.       need_check_timestamps = TRUE;        /* check later */
  216. --- 6364,6370 ----
  217.   
  218.       if (!stuff_empty() || global_busy || !typebuf_typed()
  219.   #ifdef FEAT_AUTOCMD
  220. !             || autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0
  221.   #endif
  222.                       )
  223.       need_check_timestamps = TRUE;        /* check later */
  224. ***************
  225. *** 6522,6529 ****
  226. --- 6566,6575 ----
  227.           set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
  228.           set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
  229.   # endif
  230. +         ++allbuf_lock;
  231.           n = apply_autocmds(EVENT_FILECHANGEDSHELL,
  232.                         buf->b_fname, buf->b_fname, FALSE, buf);
  233. +         --allbuf_lock;
  234.           busy = FALSE;
  235.           if (n)
  236.           {
  237. *** ../vim-7.2.131/src/proto/ex_getln.pro    Fri Nov 28 10:59:57 2008
  238. --- src/proto/ex_getln.pro    Sun Mar  1 00:27:12 2009
  239. ***************
  240. *** 4,9 ****
  241. --- 4,10 ----
  242.   int text_locked __ARGS((void));
  243.   void text_locked_msg __ARGS((void));
  244.   int curbuf_locked __ARGS((void));
  245. + int allbuf_locked __ARGS((void));
  246.   char_u *getexline __ARGS((int c, void *dummy, int indent));
  247.   char_u *getexmodeline __ARGS((int promptc, void *dummy, int indent));
  248.   int cmdline_overstrike __ARGS((void));
  249. *** ../vim-7.2.131/src/version.c    Wed Mar  4 04:11:56 2009
  250. --- src/version.c    Thu Mar  5 03:08:54 2009
  251. ***************
  252. *** 678,679 ****
  253. --- 678,681 ----
  254.   {   /* Add new patch number below this line */
  255. + /**/
  256. +     132,
  257.   /**/
  258.  
  259. -- 
  260. hundred-and-one symptoms of being an internet addict:
  261. 168. You have your own domain name.
  262.  
  263.  /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
  264. ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
  265. \\\        download, build and distribute -- http://www.A-A-P.org        ///
  266.  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
  267.