mirror of
https://github.com/vim/vim.git
synced 2025-10-07 05:54:16 -04:00
patch 8.1.0660: sign_cleanup() may leak memory
Problem: sign_cleanup() may leak memory. Solution: Free the group name before returning. Add a few more tests. (Yegappan Lakshmanan)
This commit is contained in:
@@ -11578,7 +11578,7 @@ f_sign_unplace(typval_T *argvars, typval_T *rettv)
|
|||||||
if (argvars[1].v_type != VAR_DICT)
|
if (argvars[1].v_type != VAR_DICT)
|
||||||
{
|
{
|
||||||
EMSG(_(e_dictreq));
|
EMSG(_(e_dictreq));
|
||||||
return;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
dict = argvars[1].vval.v_dict;
|
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"),
|
EMSG2(_("E158: Invalid buffer name: %s"),
|
||||||
tv_get_string(&di->di_tv));
|
tv_get_string(&di->di_tv));
|
||||||
return;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dict_find(dict, (char_u *)"id", -1) != NULL)
|
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)
|
if (sign_unplace(sign_id, group, buf, 0) == OK)
|
||||||
rettv->vval.v_number = 0;
|
rettv->vval.v_number = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
vim_free(group);
|
vim_free(group);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -385,6 +385,8 @@ func Test_sign_funcs()
|
|||||||
\ {"lnum" : -1})', 'E885:')
|
\ {"lnum" : -1})', 'E885:')
|
||||||
call assert_fails('call sign_place(22, "", "sign1", "Xsign",
|
call assert_fails('call sign_place(22, "", "sign1", "Xsign",
|
||||||
\ {"lnum" : 0})', 'E885:')
|
\ {"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}))
|
call assert_equal(-1, sign_place(1, "*", "sign1", "Xsign", {"lnum" : 10}))
|
||||||
|
|
||||||
" Tests for sign_getplaced()
|
" Tests for sign_getplaced()
|
||||||
@@ -420,9 +422,9 @@ func Test_sign_funcs()
|
|||||||
\ {'id' : 20, 'buffer' : 'buffer.c'})", 'E158:')
|
\ {'id' : 20, 'buffer' : 'buffer.c'})", 'E158:')
|
||||||
call assert_fails("call sign_unplace('',
|
call assert_fails("call sign_unplace('',
|
||||||
\ {'id' : 20, 'buffer' : ''})", 'E158:')
|
\ {'id' : 20, 'buffer' : ''})", 'E158:')
|
||||||
call assert_fails("call sign_unplace('',
|
call assert_fails("call sign_unplace('g1',
|
||||||
\ {'id' : 20, 'buffer' : 200})", 'E158:')
|
\ {'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()
|
" Tests for sign_undefine()
|
||||||
call assert_equal(0, sign_undefine("sign1"))
|
call assert_equal(0, sign_undefine("sign1"))
|
||||||
@@ -1042,6 +1044,9 @@ func Test_sign_id_autogen()
|
|||||||
|
|
||||||
call assert_equal(1, sign_place(0, 'g1', 'sign1', 'Xsign',
|
call assert_equal(1, sign_place(0, 'g1', 'sign1', 'Xsign',
|
||||||
\ {'lnum' : 11}))
|
\ {'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(0, sign_unplace('g1', {'id' : 1}))
|
||||||
call assert_equal(10,
|
call assert_equal(10,
|
||||||
\ sign_getplaced('Xsign', {'id' : 1})[0].signs[0].lnum)
|
\ sign_getplaced('Xsign', {'id' : 1})[0].signs[0].lnum)
|
||||||
@@ -1085,6 +1090,8 @@ func Test_sign_priority()
|
|||||||
" Error case
|
" Error case
|
||||||
call assert_fails("call sign_place(1, 'g1', 'sign1', 'Xsign',
|
call assert_fails("call sign_place(1, 'g1', 'sign1', 'Xsign',
|
||||||
\ [])", 'E715:')
|
\ [])", 'E715:')
|
||||||
|
call assert_fails("call sign_place(1, 'g1', 'sign1', 'Xsign',
|
||||||
|
\ {'priority' : []})", 'E745:')
|
||||||
call sign_unplace('*')
|
call sign_unplace('*')
|
||||||
|
|
||||||
" Tests for the :sign place command with priority
|
" Tests for the :sign place command with priority
|
||||||
|
@@ -799,6 +799,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
660,
|
||||||
/**/
|
/**/
|
||||||
659,
|
659,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user