BUG/MINOR: hlua: Fix memory leaks on error path when registering a converter

When an error occurred in hlua_register_converters(), 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.
This commit is contained in:
Christopher Faulet 2021-04-12 14:08:21 +02:00
parent 5294ec0708
commit aa22430bba

View File

@ -6741,7 +6741,7 @@ __LJMP static int hlua_register_converters(lua_State *L)
const char *name; const char *name;
int ref; int ref;
int len; int len;
struct hlua_function *fcn; struct hlua_function *fcn = NULL;
struct sample_conv *sc; struct sample_conv *sc;
struct buffer *trash; struct buffer *trash;
@ -6770,15 +6770,15 @@ __LJMP static int hlua_register_converters(lua_State *L)
/* Allocate and fill the sample fetch keyword struct. */ /* Allocate and fill the sample fetch keyword struct. */
sck = calloc(1, sizeof(*sck) + sizeof(struct sample_conv) * 2); sck = calloc(1, sizeof(*sck) + sizeof(struct sample_conv) * 2);
if (!sck) if (!sck)
WILL_LJMP(luaL_error(L, "Lua out of memory error.")); goto alloc_error;
fcn = new_hlua_function(); fcn = new_hlua_function();
if (!fcn) if (!fcn)
WILL_LJMP(luaL_error(L, "Lua out of memory error.")); goto alloc_error;
/* Fill fcn. */ /* Fill fcn. */
fcn->name = strdup(name); fcn->name = strdup(name);
if (!fcn->name) if (!fcn->name)
WILL_LJMP(luaL_error(L, "Lua out of memory error.")); goto alloc_error;
fcn->function_ref[hlua_state_id] = ref; fcn->function_ref[hlua_state_id] = ref;
/* List head */ /* List head */
@ -6788,7 +6788,7 @@ __LJMP static int hlua_register_converters(lua_State *L)
len = strlen("lua.") + strlen(name) + 1; len = strlen("lua.") + strlen(name) + 1;
sck->kw[0].kw = calloc(1, len); sck->kw[0].kw = calloc(1, len);
if (!sck->kw[0].kw) if (!sck->kw[0].kw)
WILL_LJMP(luaL_error(L, "Lua out of memory error.")); goto alloc_error;
snprintf((char *)sck->kw[0].kw, len, "lua.%s", name); snprintf((char *)sck->kw[0].kw, len, "lua.%s", name);
sck->kw[0].process = hlua_sample_conv_wrapper; sck->kw[0].process = hlua_sample_conv_wrapper;
@ -6802,6 +6802,12 @@ __LJMP static int hlua_register_converters(lua_State *L)
sample_register_convs(sck); sample_register_convs(sck);
return 0; return 0;
alloc_error:
release_hlua_function(fcn);
ha_free(&sck);
WILL_LJMP(luaL_error(L, "Lua out of memory error."));
return 0; /* Never reached */
} }
/* This function is an LUA binding used for registering /* This function is an LUA binding used for registering