0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.1220: memory access error when dragging a popup window

Problem:    memory access error when dragging a popup window over a buffer
            with folding.
Solution:   Avoid going over the end of the cache. (closes #6438)
This commit is contained in:
Bram Moolenaar
2020-07-15 17:38:21 +02:00
parent 5966ea105e
commit 452143c6bf
7 changed files with 89 additions and 19 deletions

View File

@@ -2839,10 +2839,10 @@ check_termcode_mouse(
/* /*
* Compute the buffer line position from the screen position "rowp" / "colp" in * Compute the buffer line position from the screen position "rowp" / "colp" in
* window "win". * window "win".
* "plines_cache" can be NULL (no cache) or an array with "win->w_height" * "plines_cache" can be NULL (no cache) or an array with "Rows" entries that
* entries that caches the plines_win() result from a previous call. Entry is * caches the plines_win() result from a previous call. Entry is zero if not
* zero if not computed yet. There must be no text or setting changes since * computed yet. There must be no text or setting changes since the entry is
* the entry is put in the cache. * put in the cache.
* Returns TRUE if the position is below the last line. * Returns TRUE if the position is below the last line.
*/ */
int int
@@ -2871,7 +2871,10 @@ mouse_comp_pos(
{ {
int cache_idx = lnum - win->w_topline; int cache_idx = lnum - win->w_topline;
if (plines_cache != NULL && plines_cache[cache_idx] > 0) // Only "Rows" lines are cached, with folding we'll run out of entries
// and use the slow way.
if (plines_cache != NULL && cache_idx < Rows
&& plines_cache[cache_idx] > 0)
count = plines_cache[cache_idx]; count = plines_cache[cache_idx];
else else
{ {
@@ -2892,7 +2895,7 @@ mouse_comp_pos(
else else
#endif #endif
count = plines_win(win, lnum, TRUE); count = plines_win(win, lnum, TRUE);
if (plines_cache != NULL) if (plines_cache != NULL && cache_idx < Rows)
plines_cache[cache_idx] = count; plines_cache[cache_idx] = count;
} }
if (count > row) if (count > row)

View File

@@ -3,8 +3,14 @@
@34|╔+0#0000001#ffd7ff255|═@3|╗| +0#0000000#ffffff0@34 @34|╔+0#0000001#ffd7ff255|═@3|╗| +0#0000000#ffffff0@34
@34|║+0#0000001#ffd7ff255|1@3|║| +0#0000000#ffffff0@34 @34|║+0#0000001#ffd7ff255|1@3|║| +0#0000000#ffffff0@34
|!+0#ffffff16#00e0003|/|b|i|n|/|s|h| |[|r|u|n@1|i|n|g|]| @15|║+0#0000001#ffd7ff255|2@3|║| +0#ffffff16#00e0003@34 |!+0#ffffff16#00e0003|/|b|i|n|/|s|h| |[|r|u|n@1|i|n|g|]| @15|║+0#0000001#ffd7ff255|2@3|║| +0#ffffff16#00e0003@34
> +0#0000000#ffffff0@33|╚+0#0000001#ffd7ff255|═@3|⇲| +0#0000000#ffffff0@34 >++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@14|╚+0#0000001#ffd7ff255|═@3|⇲|-+0#0000e05#a8a8a8255@34
|~+0#4040ff13&| @73 |1+0#0000000#ffffff0@1| @72
|~| @73 |++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|[+3#0000000&|N|o| |N|a|m|e|]| @65 |2+0#0000000#ffffff0|3| @72
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|3+0#0000000#ffffff0|5| @72
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|4+0#0000000#ffffff0|7| @72
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|[+3#0000000#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @61
| +0&&@74 | +0&&@74

View File

@@ -3,8 +3,14 @@
@14|╔+0#0000001#ffd7ff255|═@3|╗| +0#0000000#ffffff0@54 @14|╔+0#0000001#ffd7ff255|═@3|╗| +0#0000000#ffffff0@54
@14|║+0#0000001#ffd7ff255|1@3|║| +0#0000000#ffffff0@54 @14|║+0#0000001#ffd7ff255|1@3|║| +0#0000000#ffffff0@54
|!+0#ffffff16#00e0003|/|b|i|n|/|s|h| |[|r|u|n@1|║+0#0000001#ffd7ff255|2@3|║| +0#ffffff16#00e0003@54 |!+0#ffffff16#00e0003|/|b|i|n|/|s|h| |[|r|u|n@1|║+0#0000001#ffd7ff255|2@3|║| +0#ffffff16#00e0003@54
> +0#0000000#ffffff0@13|╚+0#0000001#ffd7ff255|═@3|⇲| +0#0000000#ffffff0@54 >++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |╚+0#0000001#ffd7ff255|═@3|⇲|-+0#0000e05#a8a8a8255@54
|~+0#4040ff13&| @73 |1+0#0000000#ffffff0@1| @72
|~| @73 |++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|[+3#0000000&|N|o| |N|a|m|e|]| @65 |2+0#0000000#ffffff0|3| @72
|:+0&&|c|a|l@1| |D|r|a|g|i|t|(|)| @60 |++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|3+0#0000000#ffffff0|5| @72
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|4+0#0000000#ffffff0|7| @72
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|[+3#0000000#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @61
|:+0&&|c|a|l@1| |D|r|a|g|i|t|L|e|f|t|(|)| @56

View File

@@ -0,0 +1,16 @@
|v+0&#ffffff0|i|m|>| @70
@75
@75
@75
|!+0#ffffff16#00e0003|/|b|i|n|/|s|h| |[|r|u|n@1|i|n|g|]| @56
>++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|1+0#0000000#ffffff0@1| @72
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|2+0#0000000#ffffff0|3| @72
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|3+0#0000000#ffffff0|5| @72
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@14|╔+0#0000001#ffd7ff255|═@3|╗|-+0#0000e05#a8a8a8255@34
|4+0#0000000#ffffff0|7| @31|║+0#0000001#ffd7ff255|1@3|║| +0#0000000#ffffff0@34
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@14|║+0#0000001#ffd7ff255|2@3|║|-+0#0000e05#a8a8a8255@34
|[+3#0000000#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @20|╚+0#0000001#ffd7ff255|═@3|⇲| +3#0000000#ffffff0@34
|:+0&&|c|a|l@1| |D|r|a|g|i|t|D|o|w|n|(|)| @56

View File

@@ -0,0 +1,16 @@
|v+0&#ffffff0|i|m|>| @70
@75
@75
@75
|!+0#ffffff16#00e0003|/|b|i|n|/|s|h| |[|r|u|n@1|i|n|g|]| @56
>++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|1+0#0000000#ffffff0@1| @72
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|2+0#0000000#ffffff0|3| @72
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |f|o|l|d| |-@55
|3+0#0000000#ffffff0|5| @72
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |╔+0#0000001#ffd7ff255|═@3|╗|-+0#0000e05#a8a8a8255@54
|4+0#0000000#ffffff0|7| @11|║+0#0000001#ffd7ff255|1@3|║| +0#0000000#ffffff0@54
|++0#0000e05#a8a8a8255|-@1| |1@1| |l|i|n|e|s|:| |║+0#0000001#ffd7ff255|2@3|║|-+0#0000e05#a8a8a8255@54
|[+3#0000000#ffffff0|N|o| |N|a|m|e|]| |[|+|]| |╚+0#0000001#ffd7ff255|═@3|⇲| +3#0000000#ffffff0@54
|:+0&&|c|a|l@1| |D|r|a|g|i|t|D|o|w|n|L|e|f|t|(|)| @52

View File

@@ -584,9 +584,16 @@ func Test_popup_drag_termwin()
" create a popup that covers the terminal window " create a popup that covers the terminal window
let lines =<< trim END let lines =<< trim END
set foldmethod=marker
call setline(1, range(100))
for nr in range(7)
call setline(nr * 12 + 1, "fold {{{")
call setline(nr * 12 + 11 , "end }}}")
endfor
%foldclose
set shell=/bin/sh noruler set shell=/bin/sh noruler
let $PS1 = 'vim> ' let $PS1 = 'vim> '
terminal terminal ++rows=4
$wincmd w $wincmd w
let winid = popup_create(['1111', '2222'], #{ let winid = popup_create(['1111', '2222'], #{
\ drag: 1, \ drag: 1,
@@ -594,19 +601,33 @@ func Test_popup_drag_termwin()
\ border: [], \ border: [],
\ line: 3, \ line: 3,
\ }) \ })
func Dragit() func DragitLeft()
call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt") call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
endfunc endfunc
func DragitDown()
call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
endfunc
func DragitDownLeft()
call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
endfunc
map <silent> <F3> :call test_setmouse(3, &columns / 2)<CR> map <silent> <F3> :call test_setmouse(3, &columns / 2)<CR>
map <silent> <F4> :call test_setmouse(3, &columns / 2 - 20)<CR> map <silent> <F4> :call test_setmouse(3, &columns / 2 - 20)<CR>
map <silent> <F5> :call test_setmouse(12, &columns / 2)<CR>
map <silent> <F6> :call test_setmouse(12, &columns / 2 - 20)<CR>
END END
call writefile(lines, 'XtestPopupTerm') call writefile(lines, 'XtestPopupTerm')
let buf = RunVimInTerminal('-S XtestPopupTerm', #{rows: 10}) let buf = RunVimInTerminal('-S XtestPopupTerm', #{rows: 16})
call VerifyScreenDump(buf, 'Test_popupwin_term_01', {}) call VerifyScreenDump(buf, 'Test_popupwin_term_01', {})
call term_sendkeys(buf, ":call Dragit()\<CR>") call term_sendkeys(buf, ":call DragitLeft()\<CR>")
call VerifyScreenDump(buf, 'Test_popupwin_term_02', {}) call VerifyScreenDump(buf, 'Test_popupwin_term_02', {})
call term_sendkeys(buf, ":call DragitDown()\<CR>")
call VerifyScreenDump(buf, 'Test_popupwin_term_03', {})
call term_sendkeys(buf, ":call DragitDownLeft()\<CR>")
call VerifyScreenDump(buf, 'Test_popupwin_term_04', {})
" clean up " clean up
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
call delete('XtestPopupTerm') call delete('XtestPopupTerm')

View File

@@ -754,6 +754,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 */
/**/
1220,
/**/ /**/
1219, 1219,
/**/ /**/