]> granicus.if.org Git - vim/commitdiff
patch 8.2.3309: Vim9: divide by zero causes a crash v8.2.3309
authorBram Moolenaar <Bram@vim.org>
Sat, 7 Aug 2021 13:50:23 +0000 (15:50 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 7 Aug 2021 13:50:23 +0000 (15:50 +0200)
Problem:    Vim9: divide by zero causes a crash.
Solution:   Give an error message. (closes #8727)

src/testdir/test_vim9_expr.vim
src/version.c
src/vim9execute.c

index f207056fc35baaa42484c0065e56f1a88019333f..11e152407fae617ab31873e33881f7f523e15b2c 100644 (file)
@@ -1348,7 +1348,7 @@ enddef
 
 def Test_expr5_vim9script_channel()
   if !has('channel')
-    MissingFeature 'float'
+    MissingFeature 'channel'
   else
     var lines =<< trim END
         echo 'a' .. test_null_job()
@@ -1502,6 +1502,18 @@ def Test_expr6()
 
   CheckDefExecAndScriptFailure(['echo 1 / 0'], 'E1154', 1)
   CheckDefExecAndScriptFailure(['echo 1 % 0'], 'E1154', 1)
+
+  lines =<< trim END
+    var n = 0
+    eval 1 / n
+  END
+  CheckDefExecAndScriptFailure(lines, 'E1154', 2)
+
+  lines =<< trim END
+    var n = 0
+    eval 1 % n
+  END
+  CheckDefExecAndScriptFailure(lines, 'E1154', 2)
 enddef
 
 def Test_expr6_vim9script()
index 867d894a2f8c31c3d285f9d89e5d6caf59df251a..97823dfd8fd35b3ae4916e8e822a61bbf0b981a8 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3309,
 /**/
     3308,
 /**/
index b7288151272d5e17c1472d2499c32c0e9965352e..e6ba700787376bdfc7b8cb49c8fbea2079044600 100644 (file)
@@ -3435,13 +3435,22 @@ exec_instructions(ectx_T *ectx)
                    typval_T    *tv2 = STACK_TV_BOT(-1);
                    varnumber_T arg1 = tv1->vval.v_number;
                    varnumber_T arg2 = tv2->vval.v_number;
-                   varnumber_T res;
+                   varnumber_T res = 0;
+                   int         div_zero = FALSE;
 
                    switch (iptr->isn_arg.op.op_type)
                    {
                        case EXPR_MULT: res = arg1 * arg2; break;
-                       case EXPR_DIV: res = arg1 / arg2; break;
-                       case EXPR_REM: res = arg1 % arg2; break;
+                       case EXPR_DIV:  if (arg2 == 0)
+                                           div_zero = TRUE;
+                                       else
+                                           res = arg1 / arg2;
+                                       break;
+                       case EXPR_REM:  if (arg2 == 0)
+                                           div_zero = TRUE;
+                                       else
+                                           res = arg1 % arg2;
+                                       break;
                        case EXPR_SUB: res = arg1 - arg2; break;
                        case EXPR_ADD: res = arg1 + arg2; break;
 
@@ -3451,7 +3460,7 @@ exec_instructions(ectx_T *ectx)
                        case EXPR_GEQUAL: res = arg1 >= arg2; break;
                        case EXPR_SMALLER: res = arg1 < arg2; break;
                        case EXPR_SEQUAL: res = arg1 <= arg2; break;
-                       default: res = 0; break;
+                       default: break;
                    }
 
                    --ectx->ec_stack.ga_len;
@@ -3462,6 +3471,12 @@ exec_instructions(ectx_T *ectx)
                    }
                    else
                        tv1->vval.v_number = res;
+                   if (div_zero)
+                   {
+                       SOURCING_LNUM = iptr->isn_lnum;
+                       emsg(_(e_divide_by_zero));
+                       goto on_error;
+                   }
                }
                break;