BUG/MINOR: hlua: Fix memory leaks on error path when registering a task
When an error occurred in hlua_register_task(), the allocated lua context
and task must be released to avoid memory leaks.
This patch may be backported in all stable versions.
diff --git a/src/hlua.c b/src/hlua.c
index c147fc3..660c967 100644
--- a/src/hlua.c
+++ b/src/hlua.c
@@ -6402,8 +6402,8 @@
*/
static int hlua_register_task(lua_State *L)
{
- struct hlua *hlua;
- struct task *task;
+ struct hlua *hlua = NULL;
+ struct task *task = NULL;
int ref;
int state_id;
@@ -6424,7 +6424,7 @@
hlua = pool_alloc(pool_head_hlua);
if (!hlua)
- WILL_LJMP(luaL_error(L, "Lua out of memory error."));
+ goto alloc_error;
HLUA_INIT(hlua);
/* We are in the common lua state, execute the task anywhere,
@@ -6435,13 +6435,13 @@
else
task = task_new(tid_bit);
if (!task)
- WILL_LJMP(luaL_error(L, "Lua out of memory error."));
+ goto alloc_error;
task->context = hlua;
task->process = hlua_process_task;
if (!hlua_ctx_init(hlua, state_id, task, 1))
- WILL_LJMP(luaL_error(L, "Lua out of memory error."));
+ goto alloc_error;
/* Restore the function in the stack. */
lua_rawgeti(hlua->T, LUA_REGISTRYINDEX, ref);
@@ -6451,6 +6451,12 @@
task_schedule(task, now_ms);
return 0;
+
+ alloc_error:
+ task_destroy(task);
+ hlua_ctx_destroy(hlua);
+ WILL_LJMP(luaL_error(L, "Lua out of memory error."));
+ return 0; /* Never reached */
}
/* Wrapper called by HAProxy to execute an LUA converter. This wrapper