From: Christopher Faulet Date: Fri, 19 Mar 2021 14:41:08 +0000 (+0100) Subject: BUG/MEDIUM: debug/lua: Don't dump the lua stack if not dumpable X-Git-Tag: v2.4-dev13~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=83926a04;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: debug/lua: Don't dump the lua stack if not dumpable When we try to dump the stack of a lua context, if it is not dumpable, nothing is performed and a message is emitted instead. This happens when a lua execution was interrupted inside a non-reentrant part. This patch depends on following commit : * MEDIUM: lua: Use a per-thread counter to track some non-reentrant parts of lua Thanks to this patch, we avoid a possible deadllock if the lua is interrupted by the watchdog in the lua memory allocator, because realloc() is not async-signal-safe. Both patches must be backported as far as 2.0. --- diff --git a/src/debug.c b/src/debug.c index f86d054905..9346828577 100644 --- a/src/debug.c +++ b/src/debug.c @@ -264,9 +264,13 @@ void ha_task_dump(struct buffer *buf, const struct task *task, const char *pfx) } if (hlua && hlua->T) { - luaL_traceback(hlua->T, hlua->T, NULL, 0); - if (!append_prefixed_str(buf, lua_tostring(hlua->T, -1), pfx, '\n', 1)) - b_putchr(buf, '\n'); + if (hlua_not_dumpable == 0) { + luaL_traceback(hlua->T, hlua->T, NULL, 0); + if (!append_prefixed_str(buf, lua_tostring(hlua->T, -1), pfx, '\n', 1)) + b_putchr(buf, '\n'); + } + else + chunk_appendf(buf, "Inside non-rentrant part, Stack traceback not available\n"); } else b_putchr(buf, '\n');