Patch 8.0.0607
Problem:    When creating a bufref, then using :bwipe and :new it might get
            the same memory and bufref_valid() returns true.
Solution:   Add br_fnum to check the buffer number didn't change.
Files:      src/structs.h, src/buffer.c, src/globals.h, src/if_py_both.h,
            src/quickfix.c


*** ../vim-8.0.0606/src/structs.h       2017-04-07 19:50:08.687049344 +0200
--- src/structs.h       2017-05-30 22:21:52.526534895 +0200
***************
*** 69,79 ****
  typedef int                   scid_T;         /* script ID */
  typedef struct file_buffer    buf_T;  /* forward declaration */
  
! /* Reference to a buffer that stores the value of buf_free_count.
   * bufref_valid() only needs to check "buf" when the count differs.
   */
  typedef struct {
      buf_T   *br_buf;
      int           br_buf_free_count;
  } bufref_T;
  
--- 69,81 ----
  typedef int                   scid_T;         /* script ID */
  typedef struct file_buffer    buf_T;  /* forward declaration */
  
! /*
!  * Reference to a buffer that stores the value of buf_free_count.
   * bufref_valid() only needs to check "buf" when the count differs.
   */
  typedef struct {
      buf_T   *br_buf;
+     int           br_fnum;
      int           br_buf_free_count;
  } bufref_T;
  
*** ../vim-8.0.0606/src/buffer.c        2017-03-16 17:23:26.811815956 +0100
--- src/buffer.c        2017-05-30 22:41:24.667069705 +0200
***************
*** 372,389 ****
  set_bufref(bufref_T *bufref, buf_T *buf)
  {
      bufref->br_buf = buf;
      bufref->br_buf_free_count = buf_free_count;
  }
  
  /*
!  * Return TRUE if "bufref->br_buf" points to a valid buffer.
   * Only goes through the buffer list if buf_free_count changed.
   */
      int
  bufref_valid(bufref_T *bufref)
  {
      return bufref->br_buf_free_count == buf_free_count
!                                          ? TRUE : buf_valid(bufref->br_buf);
  }
  
  /*
--- 372,394 ----
  set_bufref(bufref_T *bufref, buf_T *buf)
  {
      bufref->br_buf = buf;
+     bufref->br_fnum = buf->b_fnum;
      bufref->br_buf_free_count = buf_free_count;
  }
  
  /*
!  * Return TRUE if "bufref->br_buf" points to the same buffer as when
!  * set_bufref() was called and it is a valid buffer.
   * Only goes through the buffer list if buf_free_count changed.
+  * Also checks if b_fnum is still the same, a :bwipe followed by :new might 
get
+  * the same allocated memory, but it's a different buffer.
   */
      int
  bufref_valid(bufref_T *bufref)
  {
      return bufref->br_buf_free_count == buf_free_count
!       ? TRUE : buf_valid(bufref->br_buf)
!                                 && bufref->br_fnum == bufref->br_buf->b_fnum;
  }
  
  /*
***************
*** 2261,2274 ****
  }
  
  /*
!  * get alternate file n
!  * set linenr to lnum or altfpos.lnum if lnum == 0
!  *    also set cursor column to altfpos.col if 'startofline' is not set.
   * if (options & GETF_SETMARK) call setpcmark()
   * if (options & GETF_ALT) we are jumping to an alternate file.
   * if (options & GETF_SWITCH) respect 'switchbuf' settings when jumping
   *
!  * return FAIL for failure, OK for success
   */
      int
  buflist_getfile(
--- 2266,2279 ----
  }
  
  /*
!  * Get alternate file "n".
!  * Set linenr to "lnum" or altfpos.lnum if "lnum" == 0.
!  *    Also set cursor column to altfpos.col if 'startofline' is not set.
   * if (options & GETF_SETMARK) call setpcmark()
   * if (options & GETF_ALT) we are jumping to an alternate file.
   * if (options & GETF_SWITCH) respect 'switchbuf' settings when jumping
   *
!  * Return FAIL for failure, OK for success.
   */
      int
  buflist_getfile(
***************
*** 2999,3005 ****
  
  #if defined(FEAT_LISTCMDS) || defined(PROTO)
  /*
!  * List all know file names (for :files and :buffers command).
   */
      void
  buflist_list(exarg_T *eap)
--- 3004,3010 ----
  
  #if defined(FEAT_LISTCMDS) || defined(PROTO)
  /*
!  * List all known file names (for :files and :buffers command).
   */
      void
  buflist_list(exarg_T *eap)
*** ../vim-8.0.0606/src/globals.h       2017-04-30 19:39:32.650857838 +0200
--- src/globals.h       2017-05-30 22:32:12.950575506 +0200
***************
*** 385,391 ****
  
  /* When deleting the current buffer, another one must be loaded.  If we know
   * which one is preferred, au_new_curbuf is set to it */
! EXTERN bufref_T       au_new_curbuf INIT(= {NULL COMMA 0});
  
  /* When deleting a buffer/window and autocmd_busy is TRUE, do not free the
   * buffer/window. but link it in the list starting with
--- 385,391 ----
  
  /* When deleting the current buffer, another one must be loaded.  If we know
   * which one is preferred, au_new_curbuf is set to it */
! EXTERN bufref_T       au_new_curbuf INIT(= {NULL COMMA 0 COMMA 0});
  
  /* When deleting a buffer/window and autocmd_busy is TRUE, do not free the
   * buffer/window. but link it in the list starting with
*** ../vim-8.0.0606/src/if_py_both.h    2017-02-23 19:00:28.512904202 +0100
--- src/if_py_both.h    2017-05-30 22:42:06.486804315 +0200
***************
*** 4311,4317 ****
      static int
  SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change)
  {
!     bufref_T  save_curbuf = {NULL, 0};
      win_T     *save_curwin = NULL;
      tabpage_T *save_curtab = NULL;
  
--- 4311,4317 ----
      static int
  SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change)
  {
!     bufref_T  save_curbuf = {NULL, 0, 0};
      win_T     *save_curwin = NULL;
      tabpage_T *save_curtab = NULL;
  
***************
*** 4415,4421 ****
        PyObject *list,
        PyInt *len_change)
  {
!     bufref_T  save_curbuf = {NULL, 0};
      win_T     *save_curwin = NULL;
      tabpage_T *save_curtab = NULL;
  
--- 4415,4421 ----
        PyObject *list,
        PyInt *len_change)
  {
!     bufref_T  save_curbuf = {NULL, 0, 0};
      win_T     *save_curwin = NULL;
      tabpage_T *save_curtab = NULL;
  
***************
*** 4616,4622 ****
      static int
  InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change)
  {
!     bufref_T  save_curbuf = {NULL, 0};
      win_T     *save_curwin = NULL;
      tabpage_T *save_curtab = NULL;
  
--- 4616,4622 ----
      static int
  InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change)
  {
!     bufref_T  save_curbuf = {NULL, 0, 0};
      win_T     *save_curwin = NULL;
      tabpage_T *save_curtab = NULL;
  
*** ../vim-8.0.0606/src/quickfix.c      2017-05-28 08:16:18.783611080 +0200
--- src/quickfix.c      2017-06-04 14:53:47.474177563 +0200
***************
*** 161,168 ****
   * Looking up a buffer can be slow if there are many.  Remember the last one
   * to make this a lot faster if there are multiple matches in the same file.
   */
! static char_u *qf_last_bufname = NULL;
! static bufref_T  qf_last_bufref = {NULL, 0};
  
  /*
   * Read the errorfile "efile" into memory, line by line, building the error
--- 161,168 ----
   * Looking up a buffer can be slow if there are many.  Remember the last one
   * to make this a lot faster if there are multiple matches in the same file.
   */
! static char_u   *qf_last_bufname = NULL;
! static bufref_T  qf_last_bufref = {NULL, 0, 0};
  
  /*
   * Read the errorfile "efile" into memory, line by line, building the error
***************
*** 2732,2738 ****
  }
  
  /*
!  * Free error list "idx".
   */
      static void
  qf_free(qf_info_T *qi, int idx)
--- 2732,2738 ----
  }
  
  /*
!  * Free all the entries in the error list "idx".
   */
      static void
  qf_free(qf_info_T *qi, int idx)
*** ../vim-8.0.0606/src/version.c       2017-05-28 08:16:18.783611080 +0200
--- src/version.c       2017-06-04 14:45:33.801558124 +0200
***************
*** 766,767 ****
--- 766,769 ----
  {   /* Add new patch number below this line */
+ /**/
+     607,
  /**/

-- 
I think that you'll agree that engineers are very effective in their social
interactions.  It's the "normal" people who are nuts.
                                (Scott Adams - The Dilbert principle)

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.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

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui