mirror of
https://github.com/neovim/neovim
synced 2025-07-16 17:21: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
|
#endif
|
||||||
}
|
}
|
||||||
const char *error = lua_tostring(lstate, -1);
|
const char *error = lua_tostring(lstate, -1);
|
||||||
|
|
||||||
loop_schedule_deferred(&main_loop,
|
loop_schedule_deferred(&main_loop,
|
||||||
event_create(nlua_luv_error_event,
|
event_create(nlua_luv_error_event,
|
||||||
xstrdup(error),
|
error != NULL ? xstrdup(error) : NULL,
|
||||||
(void *)(intptr_t)(is_callback
|
(void *)(intptr_t)(is_callback
|
||||||
? kThreadCallback
|
? kThreadCallback
|
||||||
: kThread)));
|
: kThread)));
|
||||||
|
@ -27,6 +27,26 @@ describe('thread', function()
|
|||||||
})
|
})
|
||||||
end)
|
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()
|
it('entry func is executed in protected mode', function()
|
||||||
exec_lua [[
|
exec_lua [[
|
||||||
local thread = vim.uv.new_thread(function()
|
local thread = vim.uv.new_thread(function()
|
||||||
|
Reference in New Issue
Block a user