Mercurial > vim
changeset 18162:9c3347b21b89 v8.1.2076
patch 8.1.2076: crash when trying to put a terminal in a popup window
Commit: https://github.com/vim/vim/commit/e0d749a49630778d45642d7589a3703697746760
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Sep 25 22:14:48 2019 +0200
patch 8.1.2076: crash when trying to put a terminal in a popup window
Problem: Crash when trying to put a terminal buffer in a popup window.
Solution: Check for NULL buffer. Do not allow putting a terminal in a popup
window.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 25 Sep 2019 22:15:03 +0200 |
parents | 94e3c1e4d5ae |
children | be0960bbf0c7 |
files | runtime/doc/popup.txt src/libvterm/src/termscreen.c src/popupwin.c src/terminal.c src/testdir/test_popupwin.vim src/version.c |
diffstat | 6 files changed, 23 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/popup.txt +++ b/runtime/doc/popup.txt @@ -1,4 +1,4 @@ -*popup.txt* For Vim version 8.1. Last change: 2019 Sep 08 +*popup.txt* For Vim version 8.1. Last change: 2019 Sep 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -137,9 +137,7 @@ Options can be set on the window with `s call setwinvar(winid, '&wrap', 0) And options can be set on the buffer with `setbufvar()`, e.g.: > call setbufvar(winbufnr(winid), '&filetype', 'java') -Note that this does not trigger autocommands. Use `win_execute()` if you do -need them. - +You can also use `win_execute()` with a ":setlocal" command. ============================================================================== @@ -540,6 +538,10 @@ properties. It is in one of four forms: dictionary with a "col" entry, see below: |popup-props|. +If you want to create a new buffer yourself use |bufadd()| and pass the buffer +number to popup_create(). +It is not possible to use the buffer of a terminal window. *E278* + The second argument of |popup_create()| is a dictionary with options: line Screen line where to position the popup. Can use a number or "cursor", "cursor+1" or "cursor-1" to use
--- a/src/libvterm/src/termscreen.c +++ b/src/libvterm/src/termscreen.c @@ -75,6 +75,8 @@ static ScreenCell *getcell(const VTermSc return NULL; if(col < 0 || col >= screen->cols) return NULL; + if (screen->buffer == NULL) + return NULL; return screen->buffer + (screen->cols * row) + col; }
--- a/src/popupwin.c +++ b/src/popupwin.c @@ -1638,6 +1638,11 @@ popup_create(typval_T *argvars, typval_T semsg(_(e_nobufnr), argvars[0].vval.v_number); return NULL; } + if (buf->b_term != NULL) + { + emsg(_("E278: Cannot put a terminal buffer in a popup window")); + return NULL; + } } else if (!(argvars[0].v_type == VAR_STRING && argvars[0].vval.v_string != NULL)
--- a/src/terminal.c +++ b/src/terminal.c @@ -3347,6 +3347,8 @@ term_update_window(win_T *wp) newcols = MIN(newcols, twp->w_width); } } + if (newrows == 99999 || newcols == 99999) + return; // safety exit newrows = rows == 0 ? newrows : minsize ? MAX(rows, newrows) : rows; newcols = cols == 0 ? newcols : minsize ? MAX(cols, newcols) : cols;
--- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -1992,6 +1992,12 @@ func Test_popupwin_with_buffer() call delete('XsomeFile') endfunc +func Test_popupwin_terminal_buffer() + let ptybuf = term_start(&shell, #{hidden: 1}) + call assert_fails('let winnr = popup_create(ptybuf, #{})', 'E278:') + exe 'bwipe! ' .. ptybuf +endfunc + func Test_popupwin_with_buffer_and_filter() new Xwithfilter call setline(1, range(100))