Add multiple free for each call to lookup_args()
authorJérôme Poulin <jeromepoulin@gmail.com>
Wed, 6 Feb 2013 18:10:17 +0000 (18:10 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Mon, 22 Apr 2013 13:10:46 +0000 (15:10 +0200)
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

index 98e0a2f3d905562f7a8b19c0c140941f73f2f90c..64e509eb34c0800d8850111bcdfd213ebe8c2750 100644 (file)
--- 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);
 }