0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.4528: crash when using null_function for a partial

Problem:    Crash when using null_function for a partial.
Solution:   Don't call fname_trans_sid() with NULL. (closes #9908)
This commit is contained in:
Bram Moolenaar 2022-03-08 16:52:24 +00:00
parent 0b40d086b3
commit 673bcb10eb
3 changed files with 22 additions and 6 deletions

View File

@ -3337,6 +3337,15 @@ def Test_partial_double_nested()
assert_equal(123, RefRef())
enddef
def Test_partial_null_function()
var lines =<< trim END
var d: dict<func> = {f: null_function}
var Ref = d.f
assert_equal('func', typename(Ref))
END
v9.CheckDefAndScriptSuccess(lines)
enddef
" Using "idx" from a legacy global function does not work.
" This caused a crash when called from legacy context.
func Test_partial_call_fails()

View File

@ -5730,7 +5730,6 @@ func_has_abort(
make_partial(dict_T *selfdict_in, typval_T *rettv)
{
char_u *fname;
char_u *tofree = NULL;
ufunc_T *fp;
char_u fname_buf[FLEN_FIXED + 1];
int error;
@ -5742,13 +5741,19 @@ make_partial(dict_T *selfdict_in, typval_T *rettv)
{
fname = rettv->v_type == VAR_FUNC ? rettv->vval.v_string
: rettv->vval.v_partial->pt_name;
// Translate "s:func" to the stored function name.
fname = fname_trans_sid(fname, fname_buf, &tofree, &error);
fp = find_func(fname, FALSE);
vim_free(tofree);
if (fname != NULL)
{
char_u *tofree = NULL;
// Translate "s:func" to the stored function name.
fname = fname_trans_sid(fname, fname_buf, &tofree, &error);
fp = find_func(fname, FALSE);
vim_free(tofree);
}
}
if (fp != NULL && (fp->uf_flags & FC_DICT))
if ((fp != NULL && (fp->uf_flags & FC_DICT))
|| (rettv->v_type == VAR_FUNC && rettv->vval.v_string == NULL))
{
partial_T *pt = ALLOC_CLEAR_ONE(partial_T);

View File

@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
4528,
/**/
4527,
/**/