changeset 15593:e26caeb30026 v8.1.0804

patch 8.1.0804: crash when setting v:errmsg to empty list commit https://github.com/vim/vim/commit/4b9e91f0ba02192e4592a5c4a9bdcdd6e9efeb5e Author: Bram Moolenaar <Bram@vim.org> Date: Thu Jan 24 13:58:11 2019 +0100 patch 8.1.0804: crash when setting v:errmsg to empty list Problem: Crash when setting v:errmsg to empty list. (Jaon Franklin) Solution: Separate getting value and assigning result.
author Bram Moolenaar <Bram@vim.org>
date Thu, 24 Jan 2019 14:00:08 +0100
parents 11e7c65e8bfc
children 7a8983fe4f97
files src/eval.c src/testdir/test_eval_stuff.vim src/version.c
diffstat 3 files changed, 18 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -7892,9 +7892,16 @@ set_var(
 	{
 	    if (v->di_tv.v_type == VAR_STRING)
 	    {
-		vim_free(v->di_tv.vval.v_string);
+		VIM_CLEAR(v->di_tv.vval.v_string);
 		if (copy || tv->v_type != VAR_STRING)
-		    v->di_tv.vval.v_string = vim_strsave(tv_get_string(tv));
+		{
+		    char_u *val = tv_get_string(tv);
+
+		    // Careful: when assigning to v:errmsg and tv_get_string()
+		    // causes an error message the variable will alrady be set.
+		    if (v->di_tv.vval.v_string == NULL)
+			v->di_tv.vval.v_string = vim_strsave(val);
+		}
 		else
 		{
 		    /* Take over the string to avoid an extra alloc/free. */
--- a/src/testdir/test_eval_stuff.vim
+++ b/src/testdir/test_eval_stuff.vim
@@ -87,3 +87,10 @@ func Test_readfile_binary()
   bwipe!
   call delete('XReadfile')
 endfunc
+
+func Test_let_errmsg()
+  call assert_fails('let v:errmsg = []', 'E730:')
+  let v:errmsg = ''
+  call assert_fails('let v:errmsg = []', 'E730:')
+  let v:errmsg = ''
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -792,6 +792,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    804,
+/**/
     803,
 /**/
     802,