diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-08-20 18:35:10 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-08-20 18:41:42 +0200 |
commit | ab9f2ecfd4ecaf74eeed0e5ec41355589af3ec8f (patch) | |
tree | 69b60a7f93070e086eab544964c59d0de6b6bd61 | |
parent | f9037f186ad45b56c84f1efdc131480bec159e4f (diff) |
patch 9.0.1763: crash when passing invalid buffer to undotree()v9.0.1763
Problem: crash when passing invalid buffer to undotree()
Solution: Use get_buf_arg() instead of tv_get_buf_from_arg().
closes: #12862
closes: #12830
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
-rw-r--r-- | src/testdir/test_undo.vim | 12 | ||||
-rw-r--r-- | src/undo.c | 19 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 21 insertions, 12 deletions
diff --git a/src/testdir/test_undo.vim b/src/testdir/test_undo.vim index 461b28f697..368ebbe916 100644 --- a/src/testdir/test_undo.vim +++ b/src/testdir/test_undo.vim @@ -134,6 +134,18 @@ func Test_undotree_bufnr() call assert_notequal(d1, d) call assert_equal(d2, d) + " error cases + call assert_fails('call undotree(-1)', 'E158:') + call assert_fails('call undotree("nosuchbuf")', 'E158:') + + " after creating a buffer nosuchbuf, undotree('nosuchbuf') should + " not error out + new nosuchbuf + let d = {'seq_last': 0, 'entries': [], 'time_cur': 0, 'save_last': 0, 'synced': 1, 'save_cur': 0, 'seq_cur': 0} + call assert_equal(d, undotree("nosuchbuf")) + " clean up + bw nosuchbuf + " Drop created windows set ul& new diff --git a/src/undo.c b/src/undo.c index 85c46707e6..b2c4e9a568 100644 --- a/src/undo.c +++ b/src/undo.c @@ -3726,23 +3726,18 @@ u_undofile_reset_and_delete(buf_T *buf) void f_undotree(typval_T *argvars UNUSED, typval_T *rettv) { - typval_T *tv = &argvars[0]; - buf_T *buf; - dict_T *dict; - list_T *list; - if (in_vim9script() && check_for_opt_buffer_arg(argvars, 0) == FAIL) return; - if (tv->v_type == VAR_UNKNOWN) - buf = curbuf; - else - buf = tv_get_buf_from_arg(tv); - if (rettv_dict_alloc(rettv) == FAIL) return; - dict = rettv->vval.v_dict; + typval_T *tv = &argvars[0]; + buf_T *buf = tv->v_type == VAR_UNKNOWN ? curbuf : get_buf_arg(tv); + if (buf == NULL) + return; + + dict_T *dict = rettv->vval.v_dict; dict_add_number(dict, "synced", (long)buf->b_u_synced); dict_add_number(dict, "seq_last", buf->b_u_seq_last); @@ -3751,7 +3746,7 @@ f_undotree(typval_T *argvars UNUSED, typval_T *rettv) dict_add_number(dict, "time_cur", (long)buf->b_u_time_cur); dict_add_number(dict, "save_cur", buf->b_u_save_nr_cur); - list = list_alloc(); + list_T *list = list_alloc(); if (list != NULL) { u_eval_tree(buf, buf->b_u_oldhead, list); diff --git a/src/version.c b/src/version.c index 6455ca6855..f69e95325c 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1763, +/**/ 1762, /**/ 1761, |