mirror of
https://github.com/neovim/neovim.git
synced 2026-11-02 09:49:02 -06:00
fix(api): buffer overflow in nvim_buf_get_extmarks overlap #37184
With `overlap=true`, more extmarks than the requested limit may be collected in `extmark_get`. This then leads to an out of bounds write of `rv` in `nvim_buf_get_extmarks`.
This commit is contained in:
1 parent
a03ab03a10
commit
612cd99a00
2 files changed
+14
-2
No files matched your search
+5
-2
@@ -270,8 +270,11 @@ ExtmarkInfoArray extmark_get(buf_T *buf, uint32_t ns_id, int l_row, colnr_T l_co
|
|||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
MTPair pair;
|
while ((int64_t)kv_size(array) < amount) {
|
||||||
while (marktree_itr_step_overlap(buf->b_marktree, itr, &pair)) {
|
MTPair pair;
|
||||||
|
if (!marktree_itr_step_overlap(buf->b_marktree, itr, &pair)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
push_mark(&array, ns_id, type_filter, pair);
|
push_mark(&array, ns_id, type_filter, pair);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -817,6 +817,15 @@ describe('API/extmarks', function()
|
|||||||
get_extmarks(ns, { 2, 0 }, { 2, -1 }, { overlap = true })
|
get_extmarks(ns, { 2, 0 }, { 2, -1 }, { overlap = true })
|
||||||
)
|
)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('limits overlap results', function()
|
||||||
|
set_extmark(ns, 1, 0, 0, { end_row = 5, end_col = 0 })
|
||||||
|
set_extmark(ns, 2, 2, 5, { end_row = 2, end_col = 30 })
|
||||||
|
set_extmark(ns, 3, 0, 5, { end_row = 2, end_col = 10 })
|
||||||
|
set_extmark(ns, 4, 0, 0, { end_row = 1, end_col = 0 })
|
||||||
|
local rv = get_extmarks(ns, { 2, 0 }, { 2, -1 }, { overlap = true, limit = 1 })
|
||||||
|
eq(1, #rv)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('replace works', function()
|
it('replace works', function()
|
||||||
|
|||||||
Reference in new issue
Block a user