[OpenWrt-Devel] [PATCH uci 14/18] lua: fix memory leak in set method
Petr Štetiar
ynezz at true.cz
Mon Nov 4 19:36:53 EST 2019
scan-build from clang version 9 has reported following issue:
uci.c:624:12: warning: Potential leak of memory pointed to by 's'
return luaL_error(L, "Cannot set an uci option to an empty table value");
^~~~~~~~~~
valgrind confirmed it on the supplied test case:
==31013== 8 bytes in 1 blocks are definitely lost in loss record 1 of 1
==31013== by 0x56C49B9: strdup (strdup.c:42)
Signed-off-by: Petr Štetiar <ynezz at true.cz>
---
lua/uci.c | 5 ++++-
.../lua/test_cases/set_with_empty_table_doesnt_leak.lua | 2 ++
tests/cram/test_ucilua_testcases.t | 7 +++++++
3 files changed, 13 insertions(+), 1 deletion(-)
create mode 100644 tests/cram/lua/test_cases/set_with_empty_table_doesnt_leak.lua
diff --git a/lua/uci.c b/lua/uci.c
index 42fe4b785901..a7aaad375c20 100644
--- a/lua/uci.c
+++ b/lua/uci.c
@@ -620,8 +620,11 @@ uci_lua_set(lua_State *L)
case 4:
/* Format: uci.set("p", "s", "o", "v") */
if (lua_istable(L, nargs)) {
- if (lua_rawlen(L, nargs) < 1)
+ if (lua_rawlen(L, nargs) < 1) {
+ if (s)
+ free(s);
return luaL_error(L, "Cannot set an uci option to an empty table value");
+ }
lua_rawgeti(L, nargs, 1);
ptr.value = luaL_checkstring(L, -1);
lua_pop(L, 1);
diff --git a/tests/cram/lua/test_cases/set_with_empty_table_doesnt_leak.lua b/tests/cram/lua/test_cases/set_with_empty_table_doesnt_leak.lua
new file mode 100644
index 000000000000..83e91d3ab264
--- /dev/null
+++ b/tests/cram/lua/test_cases/set_with_empty_table_doesnt_leak.lua
@@ -0,0 +1,2 @@
+local c = uci.cursor(os.getenv("CONFIG_DIR"))
+print(pcall(c.set, c, "network", "lan", "dns", {}))
diff --git a/tests/cram/test_ucilua_testcases.t b/tests/cram/test_ucilua_testcases.t
index 279dfce9422a..6a0216b3ded8 100644
--- a/tests/cram/test_ucilua_testcases.t
+++ b/tests/cram/test_ucilua_testcases.t
@@ -8,3 +8,10 @@ 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
+
+check that set method with empty table value doesn't leak memory:
+
+ $ cp -R "$TESTDIR/config" .
+ $ export CONFIG_DIR=$(pwd)/config
+ $ ucilua $TESTDIR/lua/test_cases/set_with_empty_table_doesnt_leak.lua
+ false\tCannot set an uci option to an empty table value (esc)
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list