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:
parent
0b40d086b3
commit
673bcb10eb
@ -3337,6 +3337,15 @@ def Test_partial_double_nested()
|
|||||||
assert_equal(123, RefRef())
|
assert_equal(123, RefRef())
|
||||||
enddef
|
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.
|
" Using "idx" from a legacy global function does not work.
|
||||||
" This caused a crash when called from legacy context.
|
" This caused a crash when called from legacy context.
|
||||||
func Test_partial_call_fails()
|
func Test_partial_call_fails()
|
||||||
|
@ -5730,7 +5730,6 @@ func_has_abort(
|
|||||||
make_partial(dict_T *selfdict_in, typval_T *rettv)
|
make_partial(dict_T *selfdict_in, typval_T *rettv)
|
||||||
{
|
{
|
||||||
char_u *fname;
|
char_u *fname;
|
||||||
char_u *tofree = NULL;
|
|
||||||
ufunc_T *fp;
|
ufunc_T *fp;
|
||||||
char_u fname_buf[FLEN_FIXED + 1];
|
char_u fname_buf[FLEN_FIXED + 1];
|
||||||
int error;
|
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
|
fname = rettv->v_type == VAR_FUNC ? rettv->vval.v_string
|
||||||
: rettv->vval.v_partial->pt_name;
|
: rettv->vval.v_partial->pt_name;
|
||||||
|
if (fname != NULL)
|
||||||
|
{
|
||||||
|
char_u *tofree = NULL;
|
||||||
|
|
||||||
// Translate "s:func" to the stored function name.
|
// Translate "s:func" to the stored function name.
|
||||||
fname = fname_trans_sid(fname, fname_buf, &tofree, &error);
|
fname = fname_trans_sid(fname, fname_buf, &tofree, &error);
|
||||||
fp = find_func(fname, FALSE);
|
fp = find_func(fname, FALSE);
|
||||||
vim_free(tofree);
|
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);
|
partial_T *pt = ALLOC_CLEAR_ONE(partial_T);
|
||||||
|
|
||||||
|
@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
4528,
|
||||||
/**/
|
/**/
|
||||||
4527,
|
4527,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user