Mercurial > vim
diff src/buffer.c @ 11447:698ee9d4fe9f v8.0.0607
patch 8.0.0607: after :bwipe + :new bufref might still be valid
commit https://github.com/vim/vim/commit/45e5fd135da5710f24a1acc142692f120f8b0b78
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Jun 4 14:58:02 2017 +0200
patch 8.0.0607: after :bwipe + :new bufref might still be valid
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.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sun, 04 Jun 2017 15:00:04 +0200 |
parents | 501f46f7644c |
children | c45fb081391c |
line wrap: on
line diff
--- a/src/buffer.c +++ b/src/buffer.c @@ -372,18 +372,23 @@ open_buffer( 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 a valid buffer. + * 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); + ? TRUE : buf_valid(bufref->br_buf) + && bufref->br_fnum == bufref->br_buf->b_fnum; } /* @@ -2261,14 +2266,14 @@ free_buf_options( } /* - * 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. + * 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 + * Return FAIL for failure, OK for success. */ int buflist_getfile( @@ -2999,7 +3004,7 @@ buflist_findlnum(buf_T *buf) #if defined(FEAT_LISTCMDS) || defined(PROTO) /* - * List all know file names (for :files and :buffers command). + * List all known file names (for :files and :buffers command). */ void buflist_list(exarg_T *eap)