1
0
forked from aniani/vim

patch 9.0.1916: Crash when allocating large terminal screen

Problem:  Crash when allocating large terminal screen
Solution: Don't allow values > 1000 for terminal
          screen columns and rows

closes: #13126

Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Christian Brabandt 2023-09-19 21:05:20 +02:00
parent 476733f3d0
commit aa64ba1587
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
5 changed files with 40 additions and 1 deletions

View File

@ -776,9 +776,15 @@ static int resize(int new_rows, int new_cols, VTermStateFields *fields, void *us
if(screen->sb_buffer) if(screen->sb_buffer)
vterm_allocator_free(screen->vt, screen->sb_buffer); vterm_allocator_free(screen->vt, screen->sb_buffer);
if (new_cols > 1000)
new_cols = 1000;
screen->sb_buffer = vterm_allocator_malloc(screen->vt, sizeof(VTermScreenCell) * new_cols); screen->sb_buffer = vterm_allocator_malloc(screen->vt, sizeof(VTermScreenCell) * new_cols);
} }
if (new_rows > 1000)
new_rows = 1000;
resize_buffer(screen, 0, new_rows, new_cols, !altscreen_active, fields); resize_buffer(screen, 0, new_rows, new_cols, !altscreen_active, fields);
if(screen->buffers[BUFIDX_ALTSCREEN]) if(screen->buffers[BUFIDX_ALTSCREEN])
resize_buffer(screen, 1, new_rows, new_cols, altscreen_active, fields); resize_buffer(screen, 1, new_rows, new_cols, altscreen_active, fields);

View File

@ -272,6 +272,10 @@ parse_termwinsize(win_T *wp, int *rows, int *cols)
} }
*rows = atoi((char *)wp->w_p_tws); *rows = atoi((char *)wp->w_p_tws);
*cols = atoi((char *)p + 1); *cols = atoi((char *)p + 1);
if (*rows > 1000)
*rows = 1000;
if (*cols > 1000)
*cols = 1000;
return minsize; return minsize;
} }

View File

@ -64,6 +64,14 @@ func Test_terminal_termwinsize_option_zero()
call StopShellInTerminal(buf) call StopShellInTerminal(buf)
exe buf . 'bwipe' exe buf . 'bwipe'
" This used to crash Vim
set termwinsize=10000*10000
let buf = Run_shell_in_terminal({})
let win = bufwinid(buf)
call assert_equal([1000, 1000], term_getsize(buf))
call StopShellInTerminal(buf)
exe buf . 'bwipe'
set termwinsize= set termwinsize=
endfunc endfunc
@ -271,6 +279,25 @@ func Test_terminal_resize()
set statusline& set statusline&
endfunc endfunc
func Test_terminal_resize2()
CheckNotMSWindows
set statusline=x
terminal
call assert_equal(2, winnr('$'))
let buf = bufnr()
" Wait for the shell to display a prompt
call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))})
" This used to crash Vim
call feedkeys("printf '\033[8;99999;99999t'\<CR>", 'xt')
redraw
call feedkeys("exit\<CR>", 'xt')
call TermWait(buf)
set statusline&
endfunc
" must be nearly the last, we can't go back from GUI to terminal " must be nearly the last, we can't go back from GUI to terminal
func Test_zz1_terminal_in_gui() func Test_zz1_terminal_in_gui()
CheckCanRunGui CheckCanRunGui

View File

@ -699,6 +699,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1916,
/**/ /**/
1915, 1915,
/**/ /**/