diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-01-24 13:58:11 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-01-24 13:58:11 +0100 |
commit | 4b9e91f0ba02192e4592a5c4a9bdcdd6e9efeb5e (patch) | |
tree | a7a33a811c5e17aa3520d1294f561d4a6720696a | |
parent | ad36a3588d32985ee27bd11aa97e5195ef623158 (diff) | |
download | vim-git-4b9e91f0ba02192e4592a5c4a9bdcdd6e9efeb5e.tar.gz |
patch 8.1.0804: crash when setting v:errmsg to empty listv8.1.0804
Problem: Crash when setting v:errmsg to empty list. (Jaon Franklin)
Solution: Separate getting value and assigning result.
-rw-r--r-- | src/eval.c | 11 | ||||
-rw-r--r-- | src/testdir/test_eval_stuff.vim | 7 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 18 insertions, 2 deletions
diff --git a/src/eval.c b/src/eval.c index f111dc431..efa168eef 100644 --- a/src/eval.c +++ b/src/eval.c @@ -7892,9 +7892,16 @@ set_var( { if (v->di_tv.v_type == VAR_STRING) { - vim_free(v->di_tv.vval.v_string); + VIM_CLEAR(v->di_tv.vval.v_string); if (copy || tv->v_type != VAR_STRING) - v->di_tv.vval.v_string = vim_strsave(tv_get_string(tv)); + { + char_u *val = tv_get_string(tv); + + // Careful: when assigning to v:errmsg and tv_get_string() + // causes an error message the variable will alrady be set. + if (v->di_tv.vval.v_string == NULL) + v->di_tv.vval.v_string = vim_strsave(val); + } else { /* Take over the string to avoid an extra alloc/free. */ diff --git a/src/testdir/test_eval_stuff.vim b/src/testdir/test_eval_stuff.vim index c7b970a2c..f4b35983d 100644 --- a/src/testdir/test_eval_stuff.vim +++ b/src/testdir/test_eval_stuff.vim @@ -87,3 +87,10 @@ func Test_readfile_binary() bwipe! call delete('XReadfile') endfunc + +func Test_let_errmsg() + call assert_fails('let v:errmsg = []', 'E730:') + let v:errmsg = '' + call assert_fails('let v:errmsg = []', 'E730:') + let v:errmsg = '' +endfunc diff --git a/src/version.c b/src/version.c index dcbf1c282..8706d9868 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 804, +/**/ 803, /**/ 802, |