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

Reply via email to