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);
}
--
1.7.10.4
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel