From 9fb7eb90289552de9de544412de3f178cf6a3723 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Wed, 24 Mar 2021 14:52:24 +0100 Subject: [PATCH] BUG/MEDIUM: debug/lua: Use internal hlua function to dump the lua traceback The commit reverts following commits: * 83926a04 BUG/MEDIUM: debug/lua: Don't dump the lua stack if not dumpable * a61789a1 MEDIUM: lua: Use a per-thread counter to track some non-reentrant parts of lua Instead of relying on a Lua function to print the lua traceback into the debugger, we are now using our own internal function (hlua_traceback()). This one does not allocate memory and use a chunk instead. This avoids any issue with a possible deadlock in the memory allocator because the thread processing was interrupted during a memory allocation. This patch relies on the commit "BUG/MEDIUM: debug/lua: Use internal hlua function to dump the lua traceback". Both must be backported wherever the patches above are backported, thus as far as 2.0 (cherry picked from commit cc2c4f8f4c1d8613b481d1b346e083a9d2462811) Signed-off-by: Christopher Faulet --- include/haproxy/hlua.h | 1 - src/debug.c | 10 +++------- src/hlua.c | 9 --------- 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/include/haproxy/hlua.h b/include/haproxy/hlua.h index 20b0b45..b4e56d4 100644 --- a/include/haproxy/hlua.h +++ b/include/haproxy/hlua.h @@ -51,7 +51,6 @@ void hlua_applet_tcp_fct(struct appctx *ctx); void hlua_applet_http_fct(struct appctx *ctx); struct task *hlua_process_task(struct task *task, void *context, unsigned short state); -extern THREAD_LOCAL unsigned int hlua_not_dumpable; #else /* USE_LUA */ /************************ For use when Lua is disabled ********************/ diff --git a/src/debug.c b/src/debug.c index a47fe10..36c822c 100644 --- a/src/debug.c +++ b/src/debug.c @@ -223,13 +223,9 @@ void ha_task_dump(struct buffer *buf, const struct task *task, const char *pfx) } if (hlua && hlua->T) { - 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"); + chunk_appendf(buf, "stack traceback:\n "); + append_prefixed_str(buf, hlua_traceback(hlua->T, "\n "), pfx, '\n', 0); + b_putchr(buf, '\n'); } else b_putchr(buf, '\n'); diff --git a/src/hlua.c b/src/hlua.c index bd0c911..228bd67 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -237,9 +237,6 @@ struct hlua_mem_allocator { static struct hlua_mem_allocator hlua_global_allocator; - /* > 0 if lua is in a non-rentrant part, thus with a non-dumpable stack */ -THREAD_LOCAL unsigned int hlua_not_dumpable = 0; - /* These functions converts types between HAProxy internal args or * sample and LUA types. Another function permits to check if the * LUA stack contains arguments according with an required ARG_T @@ -8242,9 +8239,7 @@ static void *hlua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) /* it's a free */ if (ptr) zone->allocated -= osize; - hlua_not_dumpable++; free(ptr); - hlua_not_dumpable--; return NULL; } @@ -8253,9 +8248,7 @@ static void *hlua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) if (zone->limit && zone->allocated + nsize > zone->limit) return NULL; - hlua_not_dumpable++; ptr = malloc(nsize); - hlua_not_dumpable--; if (ptr) zone->allocated += nsize; return ptr; @@ -8265,9 +8258,7 @@ static void *hlua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) if (zone->limit && zone->allocated + nsize - osize > zone->limit) return NULL; - hlua_not_dumpable++; ptr = realloc(ptr, nsize); - hlua_not_dumpable--; if (ptr) zone->allocated += nsize - osize; return ptr; -- 1.7.10.4