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:
parent
476733f3d0
commit
aa64ba1587
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user