changeset 28033:73f4d1e479f2 v8.2.4541

patch 8.2.4541: Crash in debugger when a variable is not available Commit: https://github.com/vim/vim/commit/e406ff87c86de9da2d02d0e5ebbbf5c5eac051a6 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Mar 10 20:47:43 2022 +0000 patch 8.2.4541: Crash in debugger when a variable is not available Problem: Crash in debugger when a variable is not available in the current block. Solution: Check for a NULL name. (closes #9926)
author Bram Moolenaar <Bram@vim.org>
date Thu, 10 Mar 2022 22:00:04 +0100
parents 8b90d89c9bdd
children c6d9d86245e2
files src/testdir/test_debugger.vim src/version.c src/vim9execute.c
diffstat 3 files changed, 21 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_debugger.vim
+++ b/src/testdir/test_debugger.vim
@@ -73,6 +73,13 @@ func Test_Debugger()
 	  endtry
 	  return var1
 	endfunc
+        def Vim9Func()
+          for cmd in ['confirm', 'xxxxxxx']
+            for _ in [1, 2]
+              echo cmd
+            endfor
+          endfor
+        enddef
   END
   call writefile(lines, 'Xtest.vim')
 
@@ -298,6 +305,14 @@ func Test_Debugger()
 	      \ 'line 5: catch'])
   call RunDbgCmd(buf, 'c')
 
+  " Test showing local variable in :def function
+  call RunDbgCmd(buf, ':breakadd func 2 Vim9Func')
+  call RunDbgCmd(buf, ':call Vim9Func()', ['line 2:             for _ in [1, 2]'])
+  call RunDbgCmd(buf, 'next', ['line 2: for _ in [1, 2]'])
+  call RunDbgCmd(buf, 'echo cmd', ['confirm'])
+  call RunDbgCmd(buf, 'breakdel *')
+  call RunDbgCmd(buf, 'cont')
+
   " Test for :quit
   call RunDbgCmd(buf, ':debug echo Foo()')
   call RunDbgCmd(buf, 'breakdel *')
--- 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 */
 /**/
+    4541,
+/**/
     4540,
 /**/
     4539,
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1622,7 +1622,10 @@ lookup_debug_var(char_u *name)
     // Go through the local variable names, from last to first.
     for (idx = debug_var_count - 1; idx >= 0; --idx)
     {
-	if (STRCMP(((char_u **)dfunc->df_var_names.ga_data)[idx], name) == 0)
+	char_u *varname = ((char_u **)dfunc->df_var_names.ga_data)[idx];
+
+	// the variable name may be NULL when not available in this block
+	if (varname != NULL && STRCMP(varname, name) == 0)
 	    return STACK_TV_VAR(idx);
     }