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)
diff --git a/src/userfunc.c b/src/userfunc.c
index 63bb314..f0abaee 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -5730,7 +5730,6 @@
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 @@
{
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);