From 58a3cae3eb590c375bf4823052e8d9d4165050de Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 8 Sep 2022 13:43:10 +0100 Subject: patch 9.0.0416: ml_get error when appending lines in popup window Problem: ml_get error when appending lines in popup window. Solution: Only update w_topline when w_buffer matches curbuf. (closes #11074) --- src/evalbuffer.c | 6 +++++- src/testdir/dumps/Test_term_popup_bufline.dump | 15 +++++++++++++++ src/testdir/test_popupwin.vim | 23 +++++++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/testdir/dumps/Test_term_popup_bufline.dump diff --git a/src/evalbuffer.c b/src/evalbuffer.c index 15ac58021a..3527737b92 100644 --- a/src/evalbuffer.c +++ b/src/evalbuffer.c @@ -254,7 +254,11 @@ set_buffer_lines( && wp->w_cursor.lnum > append_lnum) wp->w_cursor.lnum += added; check_cursor_col(); - update_topline(); + + // Only update the window view if w_buffer matches curbuf, otherwise + // the computations will be wrong. + if (curwin->w_buffer == curbuf) + update_topline(); } done: diff --git a/src/testdir/dumps/Test_term_popup_bufline.dump b/src/testdir/dumps/Test_term_popup_bufline.dump new file mode 100644 index 0000000000..50ba4a6ecc --- /dev/null +++ b/src/testdir/dumps/Test_term_popup_bufline.dump @@ -0,0 +1,15 @@ +|1+0&#ffffff0| @73 +|2| @73 +|3| @73 +|4| @73 +>5| @35|0+0#0000001#ffd7ff255| +0#0000000#ffffff0@36 +|~+0#4040ff13&| @35|1+0#0000001#ffd7ff255| +0#4040ff13#ffffff0@36 +|!+2#ffffff16#00e0003|s|e|q| |1| |5| |[|f|i|n|i|s|h|e|d|]| @17|2+0#0000001#ffd7ff255| +2#ffffff16#00e0003@18|5|,|1| @11|A|l@1 +| +0#0000000#ffffff0@36|3+0#0000001#ffd7ff255| +0#0000000#ffffff0@36 +|~+0#4040ff13&| @35|4+0#0000001#ffd7ff255| +0#4040ff13#ffffff0@36 +|~| @35| +0#0000001#ffd7ff255| +0#4040ff13#ffffff0@36 +|~| @73 +|~| @73 +|~| @73 +|[+1#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 +| +0&&@74 diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 7cdd12865f..5230fa3e1d 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -4174,5 +4174,28 @@ func Test_bufdel_skips_popupwin_buffer() call popup_close(id) endfunc +func Test_term_popup_bufline() + " very specific situation where a non-existing buffer line is used, leading + " to an ml_get error + CheckScreendump + + let lines =<< trim END + vim9script + &scrolloff = 5 + term_start('seq 1 5', {term_finish: 'open'}) + timer_start(50, (_) => { + set cpoptions&vim + var buf = popup_create([], {})->winbufnr() + appendbufline(buf, 0, range(5)) + }) + END + call writefile(lines, 'XtestTermPopup', 'D') + let buf = RunVimInTerminal('-S XtestTermPopup', #{rows: 15}) + call VerifyScreenDump(buf, 'Test_term_popup_bufline', {}) + + " clean up + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 diff --git a/src/version.c b/src/version.c index 28f7520f90..86924eddf0 100644 --- a/src/version.c +++ b/src/version.c @@ -703,6 +703,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 416, /**/ 415, /**/ -- cgit v1.2.3