mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-27 14:58:30 +00:00
Fix memory deallocation while yielding in redbean. (#384)
The yielded coroutine was removed from the stack too early, leaving it not being anchored, which led to memory freed prematurely.
This commit is contained in:
parent
fb7e8ef1e6
commit
233144b19d
3 changed files with 6 additions and 4 deletions
5
third_party/lua/luacallwithtrace.c
vendored
5
third_party/lua/luacallwithtrace.c
vendored
|
@ -42,7 +42,10 @@ int LuaCallWithTrace(lua_State *L, int nargs, int nres, lua_State *C) {
|
|||
lua_xmove(L, C, 1 + nargs);
|
||||
// resume the coroutine thus executing the function
|
||||
status = lua_resume(C, L, nargs, &nresults);
|
||||
lua_remove(L, 1); // remove coroutine (still) at the bottom
|
||||
// remove coroutine (still) at the bottom, but only if not yielding
|
||||
// keep it when yielding to anchor, so it's not GC-collected
|
||||
// it's going to be removed at the beggining of the request handling
|
||||
if (!canyield) lua_remove(L, 1);
|
||||
if (status != LUA_OK && status != LUA_YIELD) {
|
||||
// move the error message
|
||||
lua_xmove(C, L, 1);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue