CVE: CVE-2021-3903 Upstream-Status: Backport Signed-off-by: Ross Burton From b15919c1fe0f7fc3d98ff5207ed2feb43c59009d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 25 Oct 2021 17:07:04 +0100 Subject: [PATCH] patch 8.2.3564: invalid memory access when scrolling without valid screen Problem: Invalid memory access when scrolling without a valid screen. Solution: Do not set VALID_BOTLINE in w_valid. --- src/move.c | 1 - src/testdir/test_normal.vim | 23 ++++++++++++++++++++--- src/version.c | 2 ++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/move.c b/src/move.c index 8e53d8bcb..10165ef4d 100644 --- a/src/move.c +++ b/src/move.c @@ -198,7 +198,6 @@ update_topline(void) { curwin->w_topline = curwin->w_cursor.lnum; curwin->w_botline = curwin->w_topline; - curwin->w_valid |= VALID_BOTLINE|VALID_BOTLINE_AP; curwin->w_scbind_pos = 1; return; } diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim index d45cf4159..ca87928f5 100644 --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -33,14 +33,14 @@ func CountSpaces(type, ...) else silent exe "normal! `[v`]y" endif - let g:a=strlen(substitute(@@, '[^ ]', '', 'g')) + let g:a = strlen(substitute(@@, '[^ ]', '', 'g')) let &selection = sel_save let @@ = reg_save endfunc func OpfuncDummy(type, ...) " for testing operatorfunc - let g:opt=&linebreak + let g:opt = &linebreak if a:0 " Invoked from Visual mode, use gv command. silent exe "normal! gvy" @@ -51,7 +51,7 @@ func OpfuncDummy(type, ...) endif " Create a new dummy window new - let g:bufnr=bufnr('%') + let g:bufnr = bufnr('%') endfunc fun! Test_normal00_optrans() @@ -718,6 +718,23 @@ func Test_normal17_z_scroll_hor2() bw! endfunc + +func Test_scroll_in_ex_mode() + " This was using invalid memory because w_botline was invalid. + let lines =<< trim END + diffsplit + norm os00( + call writefile(['done'], 'Xdone') + qa! + END + call writefile(lines, 'Xscript') + call assert_equal(1, RunVim([], [], '--clean -X -Z -e -s -S Xscript')) + call assert_equal(['done'], readfile('Xdone')) + + call delete('Xscript') + call delete('Xdone') +endfunc + func Test_normal18_z_fold() " basic tests for foldopen/folddelete if !has("folding") diff --git a/src/version.c b/src/version.c index 092864bbb..a9e8be0e7 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3564, /**/ 3489, /**/