]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1511: crash when using wrong arg types to assert_match() v9.0.1511
authorzeertzjq <zeertzjq@outlook.com>
Sat, 6 May 2023 11:20:05 +0000 (12:20 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 6 May 2023 11:20:05 +0000 (12:20 +0100)
Problem:    Crash when using wrong arg types to assert_match().
Solution:   Check for NULL pointer. (closes #12349)

src/testdir/test_assert.vim
src/testing.c
src/version.c

index b7530bf1b98527fafb817596443e42eb5dfd3461..d143f19f59dcb3a5cb9343039a6e65263443fc94 100644 (file)
@@ -335,6 +335,23 @@ func Test_assert_fail_fails()
   call remove(v:errors, 0)
 endfunc
 
+func Test_assert_wrong_arg_emsg_off()
+  CheckFeature folding
+
+  new
+  call setline(1, ['foo', 'bar'])
+  1,2fold
+
+  " This used to crash Vim
+  let &l:foldtext = 'assert_match({}, {})'
+  redraw!
+
+  let &l:foldtext = 'assert_equalfile({}, {})'
+  redraw!
+
+  bwipe!
+endfunc
+
 func Test_assert_fails_in_try_block()
   try
     call assert_equal(0, assert_fails('throw "error"'))
index 0954814774e30638a3cc3873b1a4bea0337d507f..dfa9c606a0c65b7a268964bfc6630ae5cdd5ebc2 100644 (file)
@@ -281,9 +281,6 @@ assert_match_common(typval_T *argvars, assert_type_T atype)
     garray_T   ga;
     char_u     buf1[NUMBUFLEN];
     char_u     buf2[NUMBUFLEN];
-    int                called_emsg_before = called_emsg;
-    char_u     *pat;
-    char_u     *text;
 
     if (in_vim9script()
            && (check_for_string_arg(argvars, 0) == FAIL
@@ -291,9 +288,9 @@ assert_match_common(typval_T *argvars, assert_type_T atype)
                || check_for_opt_string_arg(argvars, 2) == FAIL))
        return 1;
 
-    pat = tv_get_string_buf_chk(&argvars[0], buf1);
-    text = tv_get_string_buf_chk(&argvars[1], buf2);
-    if (called_emsg == called_emsg_before
+    char_u *pat = tv_get_string_buf_chk(&argvars[0], buf1);
+    char_u *text = tv_get_string_buf_chk(&argvars[1], buf2);
+    if (pat != NULL && text != NULL
                 && pattern_match(pat, text, FALSE) != (atype == ASSERT_MATCH))
     {
        prepare_assert_error(&ga);
@@ -420,24 +417,23 @@ assert_equalfile(typval_T *argvars)
 {
     char_u     buf1[NUMBUFLEN];
     char_u     buf2[NUMBUFLEN];
-    int                called_emsg_before = called_emsg;
     char_u     *fname1 = tv_get_string_buf_chk(&argvars[0], buf1);
     char_u     *fname2 = tv_get_string_buf_chk(&argvars[1], buf2);
-    garray_T   ga;
     FILE       *fd1;
     FILE       *fd2;
     char       line1[200];
     char       line2[200];
     int                lineidx = 0;
 
-    if (called_emsg > called_emsg_before)
+    if (fname1 == NULL || fname2 == NULL)
        return 0;
 
     IObuff[0] = NUL;
     fd1 = mch_fopen((char *)fname1, READBIN);
     if (fd1 == NULL)
     {
-       vim_snprintf((char *)IObuff, IOSIZE, (char *)e_cant_read_file_str, fname1);
+       vim_snprintf((char *)IObuff, IOSIZE, (char *)e_cant_read_file_str,
+                                                                      fname1);
     }
     else
     {
@@ -445,7 +441,8 @@ assert_equalfile(typval_T *argvars)
        if (fd2 == NULL)
        {
            fclose(fd1);
-           vim_snprintf((char *)IObuff, IOSIZE, (char *)e_cant_read_file_str, fname2);
+           vim_snprintf((char *)IObuff, IOSIZE, (char *)e_cant_read_file_str,
+                                                                      fname2);
        }
        else
        {
@@ -498,8 +495,10 @@ assert_equalfile(typval_T *argvars)
            fclose(fd2);
        }
     }
+
     if (IObuff[0] != NUL)
     {
+       garray_T        ga;
        prepare_assert_error(&ga);
        if (argvars[2].v_type != VAR_UNKNOWN)
        {
@@ -528,6 +527,7 @@ assert_equalfile(typval_T *argvars)
        ga_clear(&ga);
        return 1;
     }
+
     return 0;
 }
 
index 5253c49aec178eb4de9e2c0996318fd1756313cd..9f4a4493400fadda01e5d37b191be35eaeedf6c1 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1511,
 /**/
     1510,
 /**/