]> granicus.if.org Git - vim/commitdiff
patch 8.2.3419: a failing debug expression may make Vim unusable v8.2.3419
authorBram Moolenaar <Bram@vim.org>
Thu, 9 Sep 2021 10:34:19 +0000 (12:34 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 9 Sep 2021 10:34:19 +0000 (12:34 +0200)
Problem:    A failing debug expression may make Vim unusable.
Solution:   Suppress error messages. (closes #8848)

src/debugger.c
src/testdir/test_debugger.vim
src/version.c

index fc0aa03653db53d4a4c58118e9042c38cc193d90..ec948eb38183fe11eaba39adab2c018f25f3f3b6 100644 (file)
@@ -532,23 +532,17 @@ static linenr_T debuggy_find(int file,char_u *fname, linenr_T after, garray_T *g
 
 /*
  * Evaluate the "bp->dbg_name" expression and return the result.
- * Restore the got_int and called_emsg flags.
+ * Disables error messages.
  */
     static typval_T *
-eval_expr_restore(struct debuggy *bp)
+eval_expr_no_emsg(struct debuggy *bp)
 {
     typval_T   *tv;
-    int                prev_called_emsg = called_emsg;
-    int                prev_did_emsg = did_emsg;
 
-    got_int = FALSE;
+    // Disable error messages, a bad expression would make Vim unusable.
+    ++emsg_off;
     tv = eval_expr(bp->dbg_name, NULL);
-
-    // Evaluating the expression should not result in breaking the sequence of
-    // commands.
-    got_int = FALSE;
-    called_emsg = prev_called_emsg;
-    did_emsg = prev_did_emsg;
+    --emsg_off;
 
     return tv;
 }
@@ -637,7 +631,7 @@ dbg_parsearg(
     {
        bp->dbg_name = vim_strsave(p);
        if (bp->dbg_name != NULL)
-           bp->dbg_val = eval_expr_restore(bp);
+           bp->dbg_val = eval_expr_no_emsg(bp);
     }
     else
     {
@@ -983,7 +977,7 @@ debuggy_find(
            typval_T *tv;
            int       line = FALSE;
 
-           tv = eval_expr_restore(bp);
+           tv = eval_expr_no_emsg(bp);
            if (tv != NULL)
            {
                if (bp->dbg_val == NULL)
@@ -1004,7 +998,7 @@ debuggy_find(
                        debug_oldval = typval_tostring(bp->dbg_val, TRUE);
                        // Need to evaluate again, typval_compare() overwrites
                        // "tv".
-                       v = eval_expr_restore(bp);
+                       v = eval_expr_no_emsg(bp);
                        debug_newval = typval_tostring(v, TRUE);
                        free_tv(bp->dbg_val);
                        bp->dbg_val = v;
index 71fdedc5cfbd9d36c970f6d9a8cfa80627b0fbcf..957f5ac795a2402b3e77c620b1646c30f67c4d09 100644 (file)
@@ -271,9 +271,7 @@ func Test_Debugger()
   call RunDbgCmd(buf, 'breakd func a()', ['E475: Invalid argument: func a()'])
   call RunDbgCmd(buf, 'breakd func a', ['E161: Breakpoint not found: func a'])
   call RunDbgCmd(buf, 'breakd expr', ['E475: Invalid argument: expr'])
-  call RunDbgCmd(buf, 'breakd expr x', [
-             \ 'E121: Undefined variable: x',
-             \ 'E161: Breakpoint not found: expr x'])
+  call RunDbgCmd(buf, 'breakd expr x', ['E161: Breakpoint not found: expr x'])
 
   " finish the current function
   call RunDbgCmd(buf, 'finish', [
index b6216e98b9b9009a47117efbbe34124aef8b42bd..664f4ca8c20387efc33904e16cda0fc113adc780 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3419,
 /**/
     3418,
 /**/