vim-patch:9.1.1172: [security]: overflow with 'nostartofline' and Ex command in tag file (#32739)

Problem:  heap-buffer-overflow with 'nostartofline' and Ex command in
          tag file.
Solution: Set cursor column when moving cursor to line 1 (zeertzjq).

closes: vim/vim#16796

3ed6659549
This commit is contained in:
zeertzjq
2025-03-06 07:08:53 +08:00
parent 2010f398f4
commit 3e7f0a13e1
2 changed files with 37 additions and 0 deletions

View File

@@ -3014,6 +3014,8 @@ static int jumpto_tag(const char *lbuf_arg, int forceit, bool keep_help)
secure = 1;
sandbox++;
curwin->w_cursor.lnum = 1; // start command in line 1
curwin->w_cursor.col = 0;
curwin->w_cursor.coladd = 0;
do_cmdline_cmd(pbuf);
retval = OK;

View File

@@ -1623,4 +1623,39 @@ func Test_tagbsearch()
set tags& tagbsearch&
endfunc
" Test tag guessing with very short names
func Test_tag_guess_short()
call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
\ "y\tXf\t/^y()/"],
\ 'Xt', 'D')
set tags=Xt cpoptions+=t
call writefile(['', 'int * y () {}', ''], 'Xf', 'D')
let v:statusmsg = ''
let @/ = ''
ta y
call assert_match('E435:', v:statusmsg)
call assert_equal(2, line('.'))
call assert_match('<y', @/)
set tags& cpoptions-=t
endfunc
func Test_tag_excmd_with_nostartofline()
call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
\ "f\tXfile\tascii"],
\ 'Xtags', 'D')
call writefile(['f', 'foobar'], 'Xfile', 'D')
set nostartofline
new Xfile
setlocal tags=Xtags
normal! G$
" This used to cause heap-buffer-overflow
tag f
bwipe!
set startofline&
endfunc
" vim: shiftwidth=2 sts=2 expandtab