patch 8.1.1938: may crash when out of memory
Problem: May crash when out of memory.
Solution: Initialize v_type to VAR_UNKNOWN. (Dominique Pelle, closes #4871)
diff --git a/src/userfunc.c b/src/userfunc.c
index 7366fc5..3f9171d 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1501,6 +1501,10 @@
int argv_base = 0;
partial_T *partial = funcexe->partial;
+ // Initialize rettv so that it is safe for caller to invoke clear_tv(rettv)
+ // even when call_func() returns FAIL.
+ rettv->v_type = VAR_UNKNOWN;
+
// Make a copy of the name, if it comes from a funcref variable it could
// be changed or deleted in the called function.
name = len > 0 ? vim_strnsave(funcname, len) : vim_strsave(funcname);
@@ -1530,16 +1534,7 @@
}
}
- /*
- * Execute the function if executing and no errors were detected.
- */
- if (!funcexe->evaluate)
- {
- // Not evaluating, which means the return value is unknown. This
- // matters for giving error messages.
- rettv->v_type = VAR_UNKNOWN;
- }
- else if (error == ERROR_NONE)
+ if (error == ERROR_NONE && funcexe->evaluate)
{
char_u *rfname = fname;
diff --git a/src/version.c b/src/version.c
index c6bf6c5..96e0b40 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1938,
+/**/
1937,
/**/
1936,