# HG changeset patch # User Bram Moolenaar # Date 1569442503 -7200 # Node ID 9c3347b21b89830555965aea1cf97d0ba2fc0e75 # Parent 94e3c1e4d5ae5bd646d8d0bfb770950ad63382c8 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 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. diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt --- 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 diff --git a/src/libvterm/src/termscreen.c b/src/libvterm/src/termscreen.c --- 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; } diff --git a/src/popupwin.c b/src/popupwin.c --- 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) diff --git a/src/terminal.c b/src/terminal.c --- 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; diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim --- 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)) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2076, +/**/ 2075, /**/ 2074,