Skip to content

Commit

Permalink
patch 9.0.1840: [security] use-after-free in do_ecmd
Browse files Browse the repository at this point in the history
Problem:  use-after-free in do_ecmd
Solution: Verify oldwin pointer after reset_VIsual()

Signed-off-by: Christian Brabandt <cb@256bit.org>
  • Loading branch information
chrisbra committed Sep 2, 2023
1 parent acb91d3 commit e1dc9a6
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 4 deletions.
14 changes: 10 additions & 4 deletions src/ex_cmds.c
Expand Up @@ -2646,12 +2646,18 @@ do_ecmd(
goto theend;
}

/*
* End Visual mode before switching to another buffer, so the text can be
* copied into the GUI selection buffer.
*/

// End Visual mode before switching to another buffer, so the text can be
// copied into the GUI selection buffer.
// Careful: may trigger ModeChanged() autocommand

// Should we block autocommands here?
reset_VIsual();

// autocommands freed window :(
if (oldwin != NULL && !win_valid(oldwin))
oldwin = NULL;

#if defined(FEAT_EVAL)
if ((command != NULL || newlnum > (linenr_T)0)
&& *get_vim_var_str(VV_SWAPCOMMAND) == NUL)
Expand Down
2 changes: 2 additions & 0 deletions src/testdir/Make_all.mak
Expand Up @@ -105,6 +105,7 @@ NEW_TESTS = \
test_conceal \
test_const \
test_cpoptions \
test_crash \
test_crypt \
test_cscope \
test_cursor_func \
Expand Down Expand Up @@ -369,6 +370,7 @@ NEW_TESTS_RES = \
test_conceal.res \
test_const.res \
test_cpoptions.res \
test_crash.res \
test_crypt.res \
test_cscope.res \
test_cursor_func.res \
Expand Down
Binary file added src/testdir/crash/poc_huaf1
Binary file not shown.
Binary file added src/testdir/crash/poc_huaf2
Binary file not shown.
Binary file added src/testdir/crash/poc_huaf3
Binary file not shown.
20 changes: 20 additions & 0 deletions src/testdir/dumps/Test_crash_01.dump
@@ -0,0 +1,20 @@
> +0&#ffffff0@74
@75
@75
@75
@75
@75
@75
@75
@75
@75
@75
@75
@75
@75
@75
@75
@75
@75
@75
@75
25 changes: 25 additions & 0 deletions src/testdir/test_crash.vim
@@ -0,0 +1,25 @@
" Some tests, that used to crash Vim
source check.vim
source screendump.vim

CheckScreendump

func Test_crash1()
" The following used to crash Vim
let opts = #{wait_for_ruler: 0}
let args = ' -u NONE -i NONE -n -e -s -S '
let buf = RunVimInTerminal(args .. ' crash/poc_huaf1', opts)
call VerifyScreenDump(buf, 'Test_crash_01', {})
exe buf .. "bw!"

let buf = RunVimInTerminal(args .. ' crash/poc_huaf2', opts)
call VerifyScreenDump(buf, 'Test_crash_01', {})
exe buf .. "bw!"

let buf = RunVimInTerminal(args .. ' crash/poc_huaf3', opts)
call VerifyScreenDump(buf, 'Test_crash_01', {})
exe buf .. "bw!"

endfunc

" vim: shiftwidth=2 sts=2 expandtab
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -699,6 +699,8 @@ static char *(features[]) =

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

0 comments on commit e1dc9a6

Please sign in to comment.