From 1e1f503d8fb8336da22029faaa1a7252bed22976 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Poulin?= Date: Wed, 6 Feb 2013 18:10:17 +0000 Subject: [PATCH 1/1] Add multiple free for each call to lookup_args() This memory leak can be reproduced using a tight loop to uci:get() a config. lua -e 'require("posix"); require("uci"); function getconf() local tmp, uc = uci.cursor(); tmp = uc:get("system", "ntp", "enable_server"); end; while 1 do for i=0,1000 do getconf() end; print("gc"); print(collectgarbage("count")); collectgarbage(); print(collectgarbage("count")); print("sleep 1"); posix.sleep(1); end' --- lua/uci.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lua/uci.c b/lua/uci.c index 98e0a2f..64e509e 100644 --- a/lua/uci.c +++ b/lua/uci.c @@ -364,6 +364,8 @@ uci_lua_get_any(lua_State *L, bool all) err = UCI_ERR_INVAL; goto error; } + if (s) + free(s); if (!err) return 1; @@ -484,6 +486,8 @@ uci_lua_rename(lua_State *L) goto error; error: + if (s) + free(s); return uci_push_status(L, ctx, false); } @@ -533,6 +537,8 @@ uci_lua_reorder(lua_State *L) goto error; error: + if (s) + free(s); return uci_push_status(L, ctx, false); } @@ -616,6 +622,8 @@ uci_lua_set(lua_State *L) error: + if (s) + free(s); return uci_push_status(L, ctx, false); } @@ -665,6 +673,8 @@ uci_lua_package_cmd(lua_State *L, enum pkg_cmd cmd) } err: + if (s) + free(s); return uci_push_status(L, ctx, false); } -- 2.11.0