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:
Justin M. Keyes
2026-08-27 06:14:24 -04:00
committed by GitHub
parent 6eb36bcb2d
commit 02b0c80422
3 changed files with 68 additions and 7 deletions

View File

@@ -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