From 5259275347667a90fb88d8ea74331f88ad68edfc Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Fri, 3 Apr 2020 18:43:35 +0200 Subject: [PATCH] patch 8.2.0507: getbufvar() may get the wrong dictionary Problem: Getbufvar() may get the wrong dictionary. (David le Blanc) Solution: Check for empty name. (closes #5878) --- src/evalvars.c | 9 +++++++-- src/testdir/test_functions.vim | 10 ++++++++++ src/version.c | 2 ++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/evalvars.c b/src/evalvars.c index 7e408864ff..c4bc957fcd 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -2382,6 +2382,7 @@ find_var(char_u *name, hashtab_T **htp, int no_autoload) /* * Find variable "varname" in hashtab "ht" with name "htname". + * When "varname" is empty returns curwin/curtab/etc vars dictionary. * Returns NULL if not found. */ dictitem_T * @@ -3503,8 +3504,12 @@ f_getbufvar(typval_T *argvars, typval_T *rettv) else { // Look up the variable. - // Let getbufvar({nr}, "") return the "b:" dictionary. - v = find_var_in_ht(&buf->b_vars->dv_hashtab, 'b', varname, FALSE); + if (*varname == NUL) + // Let getbufvar({nr}, "") return the "b:" dictionary. + v = &buf->b_bufvar; + else + v = find_var_in_ht(&buf->b_vars->dv_hashtab, 'b', + varname, FALSE); if (v != NULL) { copy_tv(&v->di_tv, rettv); diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 7462da856d..9260fb0e5e 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -841,6 +841,16 @@ func Test_getbufvar() call assert_equal('iso-8859-2', getbufvar(bufnr('%'), '&fenc')) close + " Get the b: dict. + let b:testvar = 'one' + new + let b:testvar = 'two' + let thebuf = bufnr() + wincmd w + call assert_equal('two', getbufvar(thebuf, 'testvar')) + call assert_equal('two', getbufvar(thebuf, '').testvar) + bwipe! + set fileformats& endfunc diff --git a/src/version.c b/src/version.c index a53f44b04a..38ab531550 100644 --- a/src/version.c +++ b/src/version.c @@ -738,6 +738,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 507, /**/ 506, /**/