mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 14:21:25 +02:00
MINOR: hlua: hook yield on known lua state
When forcing a yield attempt from hlua_hook(), we should perform it on the known hlua state, not on a potential substate created using coroutine.create() from an existing hlua state from lua script. Indeed, only true hlua couroutines will properly handle the yield and perform the required timeout checks when returning in hlua_ctx_resume(). So far, this was not a concern because hlua_gethlua() would return NULL if hlua_hook() is not directly being called from a hlua coroutine anyway. But with this we're trying to make hlua_hook() ready for being called from a subcoroutine which inherits from a parent hlua ctx. In this case, no yield attempt will be performed, we will simply check for hlua timeouts. Not doing so would result in the timeout checks not being performed since hlua_ctx_resume() is completely bypassed when yielding from the subroutine, resulting in a user-defined coroutine potentially going rogue unnoticed.
This commit is contained in:
parent
2a9764baae
commit
cf0f792490
13
src/hlua.c
13
src/hlua.c
@ -1562,6 +1562,18 @@ void hlua_hook(lua_State *L, lua_Debug *ar)
|
||||
if (!hlua)
|
||||
return;
|
||||
|
||||
if (hlua->T != L) {
|
||||
/* We don't want to enforce a yield on a sub coroutine, since
|
||||
* we have no guarantees that the yield will be handled properly.
|
||||
* Indeed, only the hlua->T coroutine is being handled through
|
||||
* hlua_ctx_resume() function.
|
||||
*
|
||||
* Instead, we simply check for timeouts and wait for the sub
|
||||
* coroutine to finish..
|
||||
*/
|
||||
goto check_timeout;
|
||||
}
|
||||
|
||||
/* Lua cannot yield when its returning from a function,
|
||||
* so, we can fix the interrupt hook to 1 instruction,
|
||||
* expecting that the function is finished.
|
||||
@ -1596,6 +1608,7 @@ void hlua_hook(lua_State *L, lua_Debug *ar)
|
||||
return;
|
||||
}
|
||||
|
||||
check_timeout:
|
||||
/* If we cannot yield, check the timeout. */
|
||||
if (!hlua_timer_check(&hlua->timer)) {
|
||||
lua_pushfstring(L, "execution timeout");
|
||||
|
Loading…
x
Reference in New Issue
Block a user