summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-12-29 21:00:27 +0100
committerBram Moolenaar <Bram@vim.org>2018-12-29 21:00:27 +0100
commit1ea88a3e12e5f6afc5353cd0d6e6d4f4a89ced94 (patch)
treed29c21ca473e027fd1689d8d4de192bd1b82ce9c
parentced198d4b4efae75417e4366354679db2d0ec68e (diff)
patch 8.1.0660: sign_cleanup() may leak memoryv8.1.0660
Problem: sign_cleanup() may leak memory. Solution: Free the group name before returning. Add a few more tests. (Yegappan Lakshmanan)
-rw-r--r--src/evalfunc.c6
-rw-r--r--src/testdir/test_signs.vim21
-rw-r--r--src/version.c2
3 files changed, 20 insertions, 9 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 13e6d6e269..2e9b16a3e3 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -11578,7 +11578,7 @@ f_sign_unplace(typval_T *argvars, typval_T *rettv)
if (argvars[1].v_type != VAR_DICT)
{
EMSG(_(e_dictreq));
- return;
+ goto cleanup;
}
dict = argvars[1].vval.v_dict;
@@ -11589,7 +11589,7 @@ f_sign_unplace(typval_T *argvars, typval_T *rettv)
{
EMSG2(_("E158: Invalid buffer name: %s"),
tv_get_string(&di->di_tv));
- return;
+ goto cleanup;
}
}
if (dict_find(dict, (char_u *)"id", -1) != NULL)
@@ -11608,6 +11608,8 @@ f_sign_unplace(typval_T *argvars, typval_T *rettv)
if (sign_unplace(sign_id, group, buf, 0) == OK)
rettv->vval.v_number = 0;
}
+
+cleanup:
vim_free(group);
}
#endif
diff --git a/src/testdir/test_signs.vim b/src/testdir/test_signs.vim
index 5917fc6831..b26312a6b6 100644
--- a/src/testdir/test_signs.vim
+++ b/src/testdir/test_signs.vim
@@ -385,6 +385,8 @@ func Test_sign_funcs()
\ {"lnum" : -1})', 'E885:')
call assert_fails('call sign_place(22, "", "sign1", "Xsign",
\ {"lnum" : 0})', 'E885:')
+ call assert_fails('call sign_place(22, "", "sign1", "Xsign",
+ \ {"lnum" : []})', 'E745:')
call assert_equal(-1, sign_place(1, "*", "sign1", "Xsign", {"lnum" : 10}))
" Tests for sign_getplaced()
@@ -420,9 +422,9 @@ func Test_sign_funcs()
\ {'id' : 20, 'buffer' : 'buffer.c'})", 'E158:')
call assert_fails("call sign_unplace('',
\ {'id' : 20, 'buffer' : ''})", 'E158:')
- call assert_fails("call sign_unplace('',
+ call assert_fails("call sign_unplace('g1',
\ {'id' : 20, 'buffer' : 200})", 'E158:')
- call assert_fails("call sign_unplace('', 'mySign')", 'E715:')
+ call assert_fails("call sign_unplace('g1', 'mySign')", 'E715:')
" Tests for sign_undefine()
call assert_equal(0, sign_undefine("sign1"))
@@ -664,7 +666,7 @@ func Test_sign_group()
call delete("Xsign")
call sign_unplace('*')
call sign_undefine()
- enew | only
+ enew | only
endfunc
" Place signs used for ":sign unplace" command test
@@ -1013,7 +1015,7 @@ func Test_sign_unplace()
call sign_unplace('*')
call sign_undefine()
- enew | only
+ enew | only
call delete("Xsign1")
call delete("Xsign2")
endfunc
@@ -1042,6 +1044,9 @@ func Test_sign_id_autogen()
call assert_equal(1, sign_place(0, 'g1', 'sign1', 'Xsign',
\ {'lnum' : 11}))
+ " Check for the next generated sign id in this group
+ call assert_equal(2, sign_place(0, 'g1', 'sign1', 'Xsign',
+ \ {'lnum' : 12}))
call assert_equal(0, sign_unplace('g1', {'id' : 1}))
call assert_equal(10,
\ sign_getplaced('Xsign', {'id' : 1})[0].signs[0].lnum)
@@ -1049,7 +1054,7 @@ func Test_sign_id_autogen()
call delete("Xsign")
call sign_unplace('*')
call sign_undefine()
- enew | only
+ enew | only
endfunc
" Test for sign priority
@@ -1085,6 +1090,8 @@ func Test_sign_priority()
" Error case
call assert_fails("call sign_place(1, 'g1', 'sign1', 'Xsign',
\ [])", 'E715:')
+ call assert_fails("call sign_place(1, 'g1', 'sign1', 'Xsign',
+ \ {'priority' : []})", 'E745:')
call sign_unplace('*')
" Tests for the :sign place command with priority
@@ -1104,7 +1111,7 @@ func Test_sign_priority()
call sign_unplace('*')
call sign_undefine()
- enew | only
+ enew | only
call delete("Xsign")
endfunc
@@ -1146,6 +1153,6 @@ func Test_sign_memfailures()
call sign_unplace('*')
call sign_undefine()
- enew | only
+ enew | only
call delete("Xsign")
endfunc
diff --git a/src/version.c b/src/version.c
index e76bf4bd8c..c98fc5077b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -800,6 +800,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 660,
+/**/
659,
/**/
658,