mirror of
https://github.com/neovim/neovim
synced 2025-07-15 16:51:49 +00:00
fix(lua): prevent SIGSEGV when lua error is NULL in libuv_worker (#32091)
Problem:
Calling `xstrdup` with a NULL pointer causes a SIGSEGV if `lua_tostring` returns
NULL in `nlua_luv_thread_common_cfpcall`.
Crash stack trace:
- `_platform_strlen` → `xstrdup` (memory.c:469)
- `nlua_luv_thread_common_cfpcall` (executor.c:281)
Solution:
Check if `lua_tostring` returns NULL and pass NULL to `event_create` to avoid the crash.
(cherry picked from commit a5b1b83a26
)
Co-authored-by: 林玮 (Jade Lin) <linw1995@icloud.com>
This commit is contained in:
committed by
GitHub
parent
baaaf6a9e7
commit
4b25fe09cc
@ -274,10 +274,9 @@ static int nlua_luv_thread_common_cfpcall(lua_State *lstate, int nargs, int nres
|
||||
#endif
|
||||
}
|
||||
const char *error = lua_tostring(lstate, -1);
|
||||
|
||||
loop_schedule_deferred(&main_loop,
|
||||
event_create(nlua_luv_error_event,
|
||||
xstrdup(error),
|
||||
error != NULL ? xstrdup(error) : NULL,
|
||||
(void *)(intptr_t)(is_callback
|
||||
? kThreadCallback
|
||||
: kThread)));
|
||||
|
@ -27,6 +27,26 @@ describe('thread', function()
|
||||
})
|
||||
end)
|
||||
|
||||
it('handle non-string error', function()
|
||||
exec_lua [[
|
||||
local thread = vim.uv.new_thread(function()
|
||||
error()
|
||||
end)
|
||||
vim.uv.thread_join(thread)
|
||||
]]
|
||||
|
||||
screen:expect([[
|
||||
|
|
||||
{1:~ }|*5
|
||||
{2: }|
|
||||
{3:Error in luv thread:} |
|
||||
{3:[NULL]} |
|
||||
{4:Press ENTER or type command to continue}^ |
|
||||
]])
|
||||
feed('<cr>')
|
||||
assert_alive()
|
||||
end)
|
||||
|
||||
it('entry func is executed in protected mode', function()
|
||||
exec_lua [[
|
||||
local thread = vim.uv.new_thread(function()
|
||||
|
Reference in New Issue
Block a user