Navigation Menu

Skip to content

Commit

Permalink
patch 9.0.0213: using freed memory with error in assert argument
Browse files Browse the repository at this point in the history
Problem:    Using freed memory with error in assert argument.
Solution:   Make a copy of the error.
  • Loading branch information
brammool committed Aug 14, 2022
1 parent dbdd16b commit 249e1b9
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 6 deletions.
4 changes: 4 additions & 0 deletions src/testdir/test_assert.vim
Expand Up @@ -291,6 +291,10 @@ func Test_assert_fail_fails()
let exp = v:exception
endtry
call assert_match("E1174: String required for argument 5", exp)

call assert_equal(1, assert_fails('c0', ['', '\1']))
call assert_match("Expected '\\\\\\\\1' but got 'E939: Positive count required: c0': c0", v:errors[0])
call remove(v:errors, 0)
endfunc

func Test_assert_fails_in_try_block()
Expand Down
18 changes: 12 additions & 6 deletions src/testing.c
Expand Up @@ -597,6 +597,7 @@ f_assert_fails(typval_T *argvars, typval_T *rettv)
int save_trylevel = trylevel;
int called_emsg_before = called_emsg;
char *wrong_arg_msg = NULL;
char_u *tofree = NULL;

if (check_for_string_or_number_arg(argvars, 0) == FAIL
|| check_for_opt_string_or_list_arg(argvars, 1) == FAIL
Expand Down Expand Up @@ -660,13 +661,17 @@ f_assert_fails(typval_T *argvars, typval_T *rettv)
}
else if (list->lv_len == 2)
{
tv = &list->lv_u.mat.lv_last->li_tv;
actual = get_vim_var_str(VV_ERRMSG);
expected = tv_get_string_buf_chk(tv, buf);
if (!pattern_match(expected, actual, FALSE))
// make a copy, an error in pattern_match() may free it
tofree = actual = vim_strsave(get_vim_var_str(VV_ERRMSG));
if (actual != NULL)
{
error_found = TRUE;
expected_str = expected;
tv = &list->lv_u.mat.lv_last->li_tv;
expected = tv_get_string_buf_chk(tv, buf);
if (!pattern_match(expected, actual, FALSE))
{
error_found = TRUE;
expected_str = expected;
}
}
}
}
Expand Down Expand Up @@ -749,6 +754,7 @@ f_assert_fails(typval_T *argvars, typval_T *rettv)
msg_scrolled = 0;
lines_left = Rows;
VIM_CLEAR(emsg_assert_fails_msg);
vim_free(tofree);
set_vim_var_string(VV_ERRMSG, NULL, 0);
if (wrong_arg_msg != NULL)
emsg(_(wrong_arg_msg));
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -735,6 +735,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
213,
/**/
212,
/**/
Expand Down

0 comments on commit 249e1b9

Please sign in to comment.