From: Aurelien DARRAGON Date: Fri, 7 Apr 2023 14:34:20 +0000 (+0200) Subject: MINOR: hlua: hook yield on known lua state X-Git-Tag: v2.8-dev8~84 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cf0f79249080e653fae4adeeee7d9aa681189140;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/hlua.c b/src/hlua.c index 356c04c1b4..8f562718f1 100644 --- a/src/hlua.c +++ b/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");