From 2bc5e1be0fd36e585fdf9e2803c053e466767cd4 Mon Sep 17 00:00:00 2001 From: Luuk van Baal Date: Thu, 9 Jan 2025 17:58:37 +0100 Subject: [PATCH] fix(decor): set invalid flag for end of invalidated paired marks (cherry picked from commit 87610d82db912cda8877198c25dabbf2bb08f0aa) --- src/nvim/extmark.c | 9 ++++++--- test/functional/api/extmark_spec.lua | 10 ++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c index ab856e471b..924931416f 100644 --- a/src/nvim/extmark.c +++ b/src/nvim/extmark.c @@ -139,8 +139,9 @@ static void extmark_setraw(buf_T *buf, uint64_t mark, int row, colnr_T col, bool } if (invalid) { - row2 = mt_paired(key) ? marktree_get_altpos(buf->b_marktree, key, NULL).row : row; - buf_put_decor(buf, mt_decor(key), row, row2); + MTPos end = marktree_get_altpos(buf->b_marktree, key, itr); + mt_itr_rawkey(itr).flags &= (uint16_t) ~MT_FLAG_INVALID; + buf_put_decor(buf, mt_decor(key), row, end.row); } else if (move && key.flags & MT_FLAG_DECOR_SIGNTEXT && buf->b_signcols.autom) { buf_signcols_count_range(buf, row1, row2, 0, kNone); } @@ -387,7 +388,8 @@ void extmark_splice_delete(buf_T *buf, int l_row, colnr_T l_col, int u_row, coln bool invalidated = false; // Invalidate/delete mark if (!only_copy && !mt_invalid(mark) && mt_invalidate(mark) && !mt_end(mark)) { - MTPos endpos = marktree_get_altpos(buf->b_marktree, mark, NULL); + MarkTreeIter enditr[1] = { *itr }; + MTPos endpos = marktree_get_altpos(buf->b_marktree, mark, enditr); // Invalidate unpaired marks in deleted lines and paired marks whose entire // range has been deleted. if ((!mt_paired(mark) && mark.pos.row < u_row) @@ -402,6 +404,7 @@ void extmark_splice_delete(buf_T *buf, int l_row, colnr_T l_col, int u_row, coln copy = true; invalidated = true; mt_itr_rawkey(itr).flags |= MT_FLAG_INVALID; + mt_itr_rawkey(enditr).flags |= MT_FLAG_INVALID; marktree_revise_meta(buf->b_marktree, itr, mark); buf_decor_remove(buf, mark.pos.row, endpos.row, mark.pos.col, mt_decor(mark), false); } diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 9c042699e9..e655c1ab6b 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1797,6 +1797,16 @@ describe('API/extmarks', function() eq({}, get_extmark_by_id(ns, 4, {})) end) + it('no crash checking invalided flag of sign pair end key #31856', function() + api.nvim_buf_set_lines(0, 0, 1, false, { '', '' }) + api.nvim_set_option_value('signcolumn', 'auto:2', {}) + set_extmark(ns, 1, 0, 0, { sign_text = 'S1', invalidate = true, end_row = 0 }) + set_extmark(ns, 2, 1, 0, { sign_text = 'S2', end_row = 1 }) + command('d') + api.nvim_buf_clear_namespace(0, ns, 0, -1) + n.assert_alive() + end) + it('can set a URL', function() local url1 = 'https://example.com' local url2 = 'http://127.0.0.1'