From 5c028d7f9d898e490f4afa04a4a0f07f39c89889 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 12 Apr 2021 15:11:44 +0200 Subject: [PATCH] BUG/MINOR: hlua: Fix memory leaks on error path when registering a service When an error occurred in hlua_register_service(), the allocated lua function and keyword must be released to avoid memory leaks. This patch depends on "MINOR: hlua: Add function to release a lua function". It may be backported in all stable versions. --- src/hlua.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/hlua.c b/src/hlua.c index 9d8014acc..d70050352 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -7847,7 +7847,7 @@ __LJMP static int hlua_register_service(lua_State *L) const char *env; int ref; int len; - struct hlua_function *fcn; + struct hlua_function *fcn = NULL; struct buffer *trash; struct action_kw *akw; @@ -7879,16 +7879,16 @@ __LJMP static int hlua_register_service(lua_State *L) /* Allocate and fill the sample fetch keyword struct. */ akl = calloc(1, sizeof(*akl) + sizeof(struct action_kw) * 2); if (!akl) - WILL_LJMP(luaL_error(L, "Lua out of memory error.")); + goto alloc_error; fcn = new_hlua_function(); if (!fcn) - WILL_LJMP(luaL_error(L, "Lua out of memory error.")); + goto alloc_error; /* Fill fcn. */ len = strlen("") + strlen(name) + 1; fcn->name = calloc(1, len); if (!fcn->name) - WILL_LJMP(luaL_error(L, "Lua out of memory error.")); + goto alloc_error; snprintf((char *)fcn->name, len, "", name); fcn->function_ref[hlua_state_id] = ref; @@ -7899,7 +7899,7 @@ __LJMP static int hlua_register_service(lua_State *L) len = strlen("lua.") + strlen(name) + 1; akl->kw[0].kw = calloc(1, len); if (!akl->kw[0].kw) - WILL_LJMP(luaL_error(L, "Lua out of memory error.")); + goto alloc_error; snprintf((char *)akl->kw[0].kw, len, "lua.%s", name); @@ -7908,9 +7908,14 @@ __LJMP static int hlua_register_service(lua_State *L) akl->kw[0].parse = action_register_service_tcp; else if (strcmp(env, "http") == 0) akl->kw[0].parse = action_register_service_http; - else + else { + release_hlua_function(fcn); + if (akl) + ha_free((char **)&(akl->kw[0].kw)); + ha_free(&akl); WILL_LJMP(luaL_error(L, "Lua service environment '%s' is unknown. " "'tcp' or 'http' are expected.", env)); + } akl->kw[0].match_pfx = 0; akl->kw[0].private = fcn; @@ -7922,6 +7927,12 @@ __LJMP static int hlua_register_service(lua_State *L) service_keywords_register(akl); return 0; + + alloc_error: + release_hlua_function(fcn); + ha_free(&akl); + WILL_LJMP(luaL_error(L, "Lua out of memory error.")); + return 0; /* Never reached */ } /* This function initialises Lua cli handler. It copies the