diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-03-20 19:49:20 +0100 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2024-03-20 19:49:20 +0100 |
commit | 918b92b961ac319ddb5f24d8cade2cf6aeebc5d5 (patch) | |
tree | d4aeb2d902e505b61a425ef8d2f275d616c0132e | |
parent | 9f26e5a9bcedb3caef26e9d77849ea37a3626bbf (diff) |
patch 9.1.0189: Memory leak with "above" virttext and 'relativenumber'v9.1.0189
Problem: Memory leak with "above" virtual text and 'relativenumber'.
Solution: Free "text_props" and "text_prop_idxs" before returning.
Also fix off-by-one error causing line number to be drawn
beyond end of window (zeertzjq).
fixes: #14239
closes: #14241
Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r-- | src/drawline.c | 6 | ||||
-rw-r--r-- | src/testdir/dumps/Test_prop_above_below_empty_6.dump | 16 | ||||
-rw-r--r-- | src/testdir/test_textprop.vim | 12 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 35 insertions, 1 deletions
diff --git a/src/drawline.c b/src/drawline.c index ed02f3cab6..a8de449af4 100644 --- a/src/drawline.c +++ b/src/drawline.c @@ -1683,8 +1683,12 @@ win_line( { // skip over rows only used for virtual text above wlv.row += wlv.text_prop_above_count; - if (wlv.row > endrow) + if (wlv.row >= endrow) + { + vim_free(text_props); + vim_free(text_prop_idxs); return wlv.row; + } wlv.screen_row += wlv.text_prop_above_count; } #endif diff --git a/src/testdir/dumps/Test_prop_above_below_empty_6.dump b/src/testdir/dumps/Test_prop_above_below_empty_6.dump new file mode 100644 index 0000000000..501364371c --- /dev/null +++ b/src/testdir/dumps/Test_prop_above_below_empty_6.dump @@ -0,0 +1,16 @@ +| +0#af5f00255#ffffff0@3|-+0#0000001#ffff4012| +0#0000000#ffffff0@54 +| +0#af5f00255&@1|1| |1+0#0000000&@7| @47 +| +0#af5f00255&@3|++0#0000001#ffff4012| +0#0000000#ffffff0@54 +| +0#af5f00255&@3|-+0#0000001#ffff4012| +0#0000000#ffffff0@54 +|2+0#af5f00255&| @2> +0#0000000&@55 +| +0#af5f00255&@3|++0#0000001#ffff4012| +0#0000000#ffffff0@54 +| +0#af5f00255&@3|-+0#0000001#ffff4012| +0#0000000#ffffff0@54 +| +0#af5f00255&@1|1| |3+0#0000000&@8| @46 +| +0#af5f00255&@3|++0#0000001#ffff4012| +0#0000000#ffffff0@54 +| +0#af5f00255&@3|-+0#0000001#ffff4012| +0#0000000#ffffff0@54 +| +0#af5f00255&@1|2| | +0#0000000&@55 +| +0#af5f00255&@3|++0#0000001#ffff4012| +0#0000000#ffffff0@54 +| +0#af5f00255&@3|-+0#0000001#ffff4012| +0#0000000#ffffff0@54 +| +0#af5f00255&@3|!+0#0000001#ffff4012| +0#0000000#ffffff0@54 +|@+0#4040ff13&@2| @56 +|:+0#0000000&|c|a|l@1| |A|d@1|M|o|r|e|(|)| @26|2|,|0|-|5|7| @7|T|o|p| diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim index c88b5477a1..a06f733706 100644 --- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -3080,6 +3080,12 @@ func Test_prop_with_text_above_below_empty() call prop_add(ln, 0, {'type': vt, 'text': '+', 'text_align': 'below'}) endfor normal G + + func AddMore() + call prop_add(5, 0, {'type': g:vt, 'text': '!', 'text_align': 'above'}) + call prop_add(5, 0, {'type': g:vt, 'text': '!', 'text_align': 'above'}) + call prop_add(5, 0, {'type': g:vt, 'text': '!', 'text_align': 'above'}) + endfunc END call writefile(lines, 'XscriptPropAboveBelowEmpty', 'D') let buf = RunVimInTerminal('-S XscriptPropAboveBelowEmpty', #{rows: 16, cols: 60}) @@ -3101,6 +3107,12 @@ func Test_prop_with_text_above_below_empty() call term_sendkeys(buf, "kk") call VerifyScreenDump(buf, 'Test_prop_above_below_empty_5', {}) + " This was drawing line number over cmdline and leaking memory. + call term_sendkeys(buf, ":call AddMore()\<CR>") + call term_sendkeys(buf, "gg") + call term_sendkeys(buf, "j") + call VerifyScreenDump(buf, 'Test_prop_above_below_empty_6', {}) + call StopVimInTerminal(buf) endfunc diff --git a/src/version.c b/src/version.c index db093a7e41..3affeffad7 100644 --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 189, +/**/ 188, /**/ 187, |