mirror of
https://github.com/neovim/neovim.git
synced 2025-10-26 12:27:24 +00:00
fix(ui): avoid recursiveness and invalid memory access #28578
Problem: Calling :redraw from vim.ui_attach() callback results in
recursive cmdline/message events.
Solution: Avoid recursiveness where possible and replace global "call_buf"
with separate, temporary buffers for each event so that when a Lua
callback for one event fires another event, that does not result
in invalid memory access.
This commit is contained in:
@@ -173,6 +173,21 @@ describe('vim.ui_attach', function()
|
||||
exec_lua('vim.cmd.tabnext()')
|
||||
eq(0, n.api.nvim_get_option_value('cmdheight', {}))
|
||||
end)
|
||||
|
||||
it('avoids recursive flushing and invalid memory access with :redraw', function()
|
||||
exec_lua([[
|
||||
_G.cmdline = 0
|
||||
vim.ui_attach(ns, { ext_messages = true }, function(ev)
|
||||
vim.cmd.redraw()
|
||||
_G.cmdline = _G.cmdline + (ev == 'cmdline_show' and 1 or 0)
|
||||
end
|
||||
)]])
|
||||
feed(':')
|
||||
eq(1, exec_lua('return _G.cmdline'))
|
||||
n.assert_alive()
|
||||
feed('version<CR><CR>v<Esc>')
|
||||
n.assert_alive()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('vim.ui_attach', function()
|
||||
|
||||
Reference in New Issue
Block a user