summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-12-29 11:57:46 +0100
committerBram Moolenaar <Bram@vim.org>2020-12-29 11:57:46 +0100
commit4012d262072a3ac95878c9d061fa985301720ec2 (patch)
tree616dc43dfb39af181922ba6a455374d939221b84
parent8242ebbdba64cfa5c504c9d8dfb802076d99c602 (diff)
patch 8.2.2243: crash when popup mask contains zeroesv8.2.2243
Problem: Crash when popup mask contains zeroes. Solution: Check boundaries properly. (closes #7569)
-rw-r--r--src/popupwin.c12
-rw-r--r--src/testdir/test_popupwin.vim4
-rw-r--r--src/version.c2
3 files changed, 16 insertions, 2 deletions
diff --git a/src/popupwin.c b/src/popupwin.c
index 13a455d4ec..7896efd210 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -3346,21 +3346,29 @@ popup_update_mask(win_T *wp, int width, int height)
cols = tv_get_number(&li->li_tv);
if (cols < 0)
cols = width + cols + 1;
+ if (cols <= 0)
+ cols = 1;
li = li->li_next;
cole = tv_get_number(&li->li_tv);
if (cole < 0)
cole = width + cole + 1;
+ if (cole > width)
+ cole = width;
li = li->li_next;
lines = tv_get_number(&li->li_tv);
if (lines < 0)
lines = height + lines + 1;
+ if (lines <= 0)
+ lines = 1;
li = li->li_next;
linee = tv_get_number(&li->li_tv);
if (linee < 0)
linee = height + linee + 1;
+ if (linee > height)
+ linee = height;
- for (row = lines - 1; row < linee && row < height; ++row)
- for (col = cols - 1; col < cole && col < width; ++col)
+ for (row = lines - 1; row < linee; ++row)
+ for (col = cols - 1; col < cole; ++col)
cells[row * width + col] = 1;
}
}
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index b8641fe7d2..bfc049438a 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -821,6 +821,10 @@ func Test_popup_with_mask()
" clean up
call StopVimInTerminal(buf)
call delete('XtestPopupMask')
+
+ " this was causing a crash
+ call popup_create('test', #{mask: [[0, 0, 0, 0]]})
+ call popup_clear()
endfunc
func Test_popup_select()
diff --git a/src/version.c b/src/version.c
index ee0d9878ca..6c6d8c640c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2243,
+/**/
2242,
/**/
2241,