aboutsummaryrefslogtreecommitdiff
path: root/test/functional/lua/ui_event_spec.lua
diff options
context:
space:
mode:
authorluukvbaal <luukvbaal@gmail.com>2024-05-01 22:51:06 +0200
committerGitHub <noreply@github.com>2024-05-01 13:51:06 -0700
commite778e0116198470ba037b9426f4ff7fa5cb7f880 (patch)
tree17921986e3eed8347c60b821d287768ab437f401 /test/functional/lua/ui_event_spec.lua
parent631d5189adaaf54eb48e0b136df3466880edb19c (diff)
downloadrneovim-e778e0116198470ba037b9426f4ff7fa5cb7f880.tar.gz
rneovim-e778e0116198470ba037b9426f4ff7fa5cb7f880.tar.bz2
rneovim-e778e0116198470ba037b9426f4ff7fa5cb7f880.zip
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.
Diffstat (limited to 'test/functional/lua/ui_event_spec.lua')
-rw-r--r--test/functional/lua/ui_event_spec.lua15
1 files changed, 15 insertions, 0 deletions
diff --git a/test/functional/lua/ui_event_spec.lua b/test/functional/lua/ui_event_spec.lua
index 4ac0268c4b..1e80c88403 100644
--- a/test/functional/lua/ui_event_spec.lua
+++ b/test/functional/lua/ui_event_spec.lua
@@ -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()