From: Jérôme Poulin Date: Wed, 6 Feb 2013 18:10:17 +0000 (+0000) Subject: Add multiple free for each call to lookup_args() X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=commitdiff_plain;h=1e1f503d8fb8336da22029faaa1a7252bed22976 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' --- 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); }