aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuuk van Baal <luukvbaal@gmail.com>2025-01-09 17:58:37 +0100
committerluukvbaal <luukvbaal@gmail.com>2025-01-10 08:14:38 +0100
commit87610d82db912cda8877198c25dabbf2bb08f0aa (patch)
treeaafe4e99c501da418590ce0501bdbde8aa526c4d
parenta37784ad831fdf31e7eeafdd41f7d3cb81b1a07f (diff)
downloadrneovim-87610d82db912cda8877198c25dabbf2bb08f0aa.tar.gz
rneovim-87610d82db912cda8877198c25dabbf2bb08f0aa.tar.bz2
rneovim-87610d82db912cda8877198c25dabbf2bb08f0aa.zip
fix(decor): set invalid flag for end of invalidated paired marks
-rw-r--r--src/nvim/extmark.c9
-rw-r--r--test/functional/api/extmark_spec.lua10
2 files changed, 16 insertions, 3 deletions
diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c
index 79eea718f4..5b47afa4b2 100644
--- a/src/nvim/extmark.c
+++ b/src/nvim/extmark.c
@@ -140,8 +140,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);
}
@@ -394,7 +395,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)
@@ -409,6 +411,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 6a94881093..c8d6110207 100644
--- a/test/functional/api/extmark_spec.lua
+++ b/test/functional/api/extmark_spec.lua
@@ -1794,6 +1794,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'