changeset 22612:b08f435d5b86 v8.2.1854

patch 8.2.1854: Vim9: crash when throwing exception for NULL string Commit: https://github.com/vim/vim/commit/1e021e63c565bbb30783a557b4e883cc27f56403 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Oct 16 20:25:23 2020 +0200 patch 8.2.1854: Vim9: crash when throwing exception for NULL string Problem: Vim9: crash when throwing exception for NULL string. (Dhiraj Mishra) Solution: Handle NULL string like empty string. (closes #7139)
author Bram Moolenaar <Bram@vim.org>
date Fri, 16 Oct 2020 20:30:04 +0200
parents 377667e0a347
children 6a54f3fd40dc
files src/errors.h src/testdir/test_vim9_script.vim src/version.c src/vim9execute.c
diffstat 4 files changed, 28 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/errors.h
+++ b/src/errors.h
@@ -280,4 +280,6 @@ EXTERN char e_missing_name_after_dot[]
 	INIT(= N_("E1127: Missing name after dot"));
 EXTERN char e_endblock_without_block[]
 	INIT(= N_("E1128: } without {"));
+EXTERN char e_throw_with_empty_string[]
+	INIT(= N_("E1129: Throw with empty string"));
 #endif
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -617,6 +617,21 @@ def Test_throw_vimscript()
       endtry
   END
   CheckScriptSuccess(lines)
+
+  lines =<< trim END
+    vim9script
+    def Func()
+      throw @r
+    enddef
+    var result = ''
+    try
+      Func()
+    catch /E1129:/
+      result = 'caught'
+    endtry
+    assert_equal('caught', result)
+  END
+  CheckScriptSuccess(lines)
 enddef
 
 def Test_error_in_nested_function()
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1854,
+/**/
     1853,
 /**/
     1852,
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1381,6 +1381,8 @@ call_def_function(
 		tv = STACK_TV_BOT(0);
 		tv->v_type = VAR_STRING;
 		tv->v_lock = 0;
+		// This may result in NULL, which should be equivalent to an
+		// empty string.
 		tv->vval.v_string = get_reg_contents(
 					  iptr->isn_arg.number, GREG_EXPR_SRC);
 		++ectx.ec_stack.ga_len;
@@ -2082,6 +2084,13 @@ call_def_function(
 	    case ISN_THROW:
 		--ectx.ec_stack.ga_len;
 		tv = STACK_TV_BOT(0);
+		if (tv->vval.v_string == NULL
+				       || *skipwhite(tv->vval.v_string) == NUL)
+		{
+		    emsg(_(e_throw_with_empty_string));
+		    goto failed;
+		}
+
 		if (throw_exception(tv->vval.v_string, ET_USER, NULL) == FAIL)
 		{
 		    vim_free(tv->vval.v_string);