summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-04-03 18:43:35 +0200
committerBram Moolenaar <Bram@vim.org>2020-04-03 18:43:35 +0200
commit5259275347667a90fb88d8ea74331f88ad68edfc (patch)
treec696583e3850e1c3cf3267bb0f5e88f69e9838e6 /src
parentd1e9dc272355fe3ab112af5f04b0516b2e9a4fa6 (diff)
patch 8.2.0507: getbufvar() may get the wrong dictionaryv8.2.0507
Problem: Getbufvar() may get the wrong dictionary. (David le Blanc) Solution: Check for empty name. (closes #5878)
Diffstat (limited to 'src')
-rw-r--r--src/evalvars.c9
-rw-r--r--src/testdir/test_functions.vim10
-rw-r--r--src/version.c2
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
@@ -739,6 +739,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 507,
+/**/
506,
/**/
505,