changeset 17883:6249953b0609 v8.1.1938

patch 8.1.1938: may crash when out of memory Commit: https://github.com/vim/vim/commit/c507a2d164cfa3dcf31a7ba9dad6663a17243bb4 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Aug 29 21:32:55 2019 +0200 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 https://github.com/vim/vim/issues/4871)
author Bram Moolenaar <Bram@vim.org>
date Thu, 29 Aug 2019 21:45:04 +0200
parents f7890929f547
children ae47d7c8416c
files src/userfunc.c src/version.c
diffstat 2 files changed, 7 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1501,6 +1501,10 @@ call_func(
     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 @@ call_func(
 	}
     }
 
-    /*
-     * 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;
 
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1938,
+/**/
     1937,
 /**/
     1936,