BUG/MINOR: hlua: Fix memory leaks on error path when registering a fetch
When an error occurred in hlua_register_fetches(), 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. It should fix #1112.
diff --git a/src/hlua.c b/src/hlua.c
index a60cd2e..693ada5 100644
--- a/src/hlua.c
+++ b/src/hlua.c
@@ -6820,7 +6820,7 @@
int ref;
int len;
struct sample_fetch_kw_list *sfk;
- struct hlua_function *fcn;
+ struct hlua_function *fcn = NULL;
struct sample_fetch *sf;
struct buffer *trash;
@@ -6849,15 +6849,15 @@
/* Allocate and fill the sample fetch keyword struct. */
sfk = calloc(1, sizeof(*sfk) + sizeof(struct sample_fetch) * 2);
if (!sfk)
- 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. */
fcn->name = strdup(name);
if (!fcn->name)
- WILL_LJMP(luaL_error(L, "Lua out of memory error."));
+ goto alloc_error;
fcn->function_ref[hlua_state_id] = ref;
/* List head */
@@ -6867,7 +6867,7 @@
len = strlen("lua.") + strlen(name) + 1;
sfk->kw[0].kw = calloc(1, len);
if (!sfk->kw[0].kw)
- return luaL_error(L, "Lua out of memory error.");
+ goto alloc_error;
snprintf((char *)sfk->kw[0].kw, len, "lua.%s", name);
sfk->kw[0].process = hlua_sample_fetch_wrapper;
@@ -6882,6 +6882,12 @@
sample_register_fetches(sfk);
return 0;
+
+ alloc_error:
+ release_hlua_function(fcn);
+ ha_free(&sfk);
+ WILL_LJMP(luaL_error(L, "Lua out of memory error."));
+ return 0; /* Never reached */
}
/* This function is a lua binding to set the wake_time.