diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-06-03 22:01:48 -0400 |
---|---|---|
committer | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-06-03 23:12:23 -0400 |
commit | 233a173226112adc9b8fed336fa03c3b32c3675f (patch) | |
tree | 375ac541a3e798129eec94e0ed8ac87df6199178 | |
parent | 7ad621b6d924ef912a4c4c7e64175213dc82a16f (diff) | |
download | rneovim-233a173226112adc9b8fed336fa03c3b32c3675f.tar.gz rneovim-233a173226112adc9b8fed336fa03c3b32c3675f.tar.bz2 rneovim-233a173226112adc9b8fed336fa03c3b32c3675f.zip |
vim-patch:8.1.0804: crash when setting v:errmsg to empty list
Problem: Crash when setting v:errmsg to empty list. (Jaon Franklin)
Solution: Separate getting value and assigning result.
https://github.com/vim/vim/commit/4b9e91f0ba02192e4592a5c4a9bdcdd6e9efeb5e
-rw-r--r-- | src/nvim/eval.c | 10 | ||||
-rw-r--r-- | src/nvim/testdir/test_eval_stuff.vim | 7 |
2 files changed, 15 insertions, 2 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index a4606f76f3..998d0568ce 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -20082,9 +20082,15 @@ static void set_var(const char *name, const size_t name_len, typval_T *const tv, // prevent changing the type. if (ht == &vimvarht) { if (v->di_tv.v_type == VAR_STRING) { - xfree(v->di_tv.vval.v_string); + XFREE_CLEAR(v->di_tv.vval.v_string); if (copy || tv->v_type != VAR_STRING) { - v->di_tv.vval.v_string = (char_u *)xstrdup(tv_get_string(tv)); + const char *const 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 = (char_u *)xstrdup(val); + } } else { // Take over the string to avoid an extra alloc/free. v->di_tv.vval.v_string = tv->vval.v_string; diff --git a/src/nvim/testdir/test_eval_stuff.vim b/src/nvim/testdir/test_eval_stuff.vim index 610ef65f8e..ff8f2e5fc7 100644 --- a/src/nvim/testdir/test_eval_stuff.vim +++ b/src/nvim/testdir/test_eval_stuff.vim @@ -92,3 +92,10 @@ func Test_nocatch_restore_silent_emsg() let c5 = nr2char(screenchar(&lines, 5)) call assert_equal('wrong', c1 . c2 . c3 . c4 . c5) 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 |