lua: fix memory leak in changes method
authorPetr Štetiar <ynezz@true.cz>
Mon, 4 Nov 2019 21:41:18 +0000 (22:41 +0100)
committerPetr Štetiar <ynezz@true.cz>
Thu, 14 Nov 2019 16:11:34 +0000 (17:11 +0100)
Configs returned by uci_list_configs call are not freed when not needed,
leading to the memory leak. While at it make the code cleaner.

Signed-off-by: Petr Štetiar <ynezz@true.cz>
lua/uci.c
tests/cram/lua/test_cases/changes_doesnt_leak.lua [new file with mode: 0644]
tests/cram/test_ucilua_testcases.t [new file with mode: 0644]

index 323f81a68c17882e33a33455603153d989f18093..42fe4b785901cf6f755470f9756a5998a700ca5c 100644 (file)
--- a/lua/uci.c
+++ b/lua/uci.c
@@ -880,16 +880,17 @@ uci_lua_changes(lua_State *L)
        lua_newtable(L);
        if (package) {
                uci_lua_changes_pkg(L, ctx, package);
-       } else {
-               if (uci_list_configs(ctx, &config) != 0)
-                       goto done;
+               return 1;
+       }
 
-               for(i = 0; config[i] != NULL; i++) {
-                       uci_lua_changes_pkg(L, ctx, config[i]);
-               }
+       if ((uci_list_configs(ctx, &config) != UCI_OK) || !config)
+               return 1;
+
+       for (i = 0; config[i] != NULL; i++) {
+               uci_lua_changes_pkg(L, ctx, config[i]);
        }
 
-done:
+       free(config);
        return 1;
 }
 
diff --git a/tests/cram/lua/test_cases/changes_doesnt_leak.lua b/tests/cram/lua/test_cases/changes_doesnt_leak.lua
new file mode 100644 (file)
index 0000000..68f0ed0
--- /dev/null
@@ -0,0 +1,11 @@
+local A = assert
+local c = uci.cursor(os.getenv("CONFIG_DIR"))
+
+A(c:set("network", "lan", "dns", {
+       "ns1.king.banik.cz",
+       "ns2.openwrt.org",
+}))
+
+local changes = c:changes()
+A(changes.network.lan.dns[1] == "ns1.king.banik.cz")
+A(changes.network.lan.dns[2] == "ns2.openwrt.org")
diff --git a/tests/cram/test_ucilua_testcases.t b/tests/cram/test_ucilua_testcases.t
new file mode 100644 (file)
index 0000000..279dfce
--- /dev/null
@@ -0,0 +1,10 @@
+set LUA_CPATH and ucilua for convenience:
+
+  $ [ -n "$UCI_LUA" ] && export LUA_CPATH="$(dirname "$UCI_LUA")/?.so"
+  $ alias ucilua="valgrind --quiet --leak-check=full lua -luci"
+
+check that changes method doesnt leak memory:
+
+  $ cp -R "$TESTDIR/config" .
+  $ export CONFIG_DIR=$(pwd)/config
+  $ ucilua $TESTDIR/lua/test_cases/changes_doesnt_leak.lua