mirror of
https://github.com/neovim/neovim.git
synced 2026-09-07 14:37:38 +00:00
fix(lua): blast radius of broken _G.debug #41507
Problem:
`nlua_pcall()` references `_G.debug.traceback`. If user code deletes it
or breaks it some other way, various Lua features are broken.
_G.debug = nil
vim.schedule(function() end)
vim.wait(100)
E5113: Lua chunk: attempt to index a nil value
stack traceback:
[C]: in function 'loop_poll'
[string "vim/_core/editor"]:176: in function 'wait'
crash.lua:3: in main chunk
PANIC: unprotected error in call to Lua API (attempt to index a nil value)
Solution:
Check `_G.debug.traceback` before using it as errfunc. If it's broken,
omit the traceback and say so in the error message.
Note: We could cache `_G.debug` in LUA_REGISTRYINDEX on startup, but
that would prevent plugins from providing custom functionality there
(and we happen to do so in `tui_spec.lua` for example).
This commit is contained in:
@@ -769,7 +769,7 @@ function vim._on_key(buf, typed_buf)
|
||||
--- @type boolean, any
|
||||
local ok, rv = xpcall(function()
|
||||
return fn(buf, typed_buf)
|
||||
end, debug.traceback)
|
||||
end, type(debug.traceback) == 'function' and debug.traceback or tostring)
|
||||
if ok and rv ~= nil then
|
||||
if type(rv) == 'string' and #rv == 0 then
|
||||
discard = true
|
||||
|
||||
Reference in New Issue
Block a user