uci: libuci leaking memory on non-existent config file
authorKrzysztof Kuznik <k.kuznik@avsystem.com>
Wed, 22 Aug 2012 08:11:23 +0000 (10:11 +0200)
committerJo-Philipp Wich <jow@openwrt.org>
Mon, 22 Apr 2013 13:04:08 +0000 (15:04 +0200)
In file file.c function uci_file_load() allocates memory for filename.
When uci_open_stream() failed with exception this memory was never freed.
This patch makes call to uci_open_stream() wrapped in exception handling
inside uci_file_load() where filename is freed.

Signed-off-by: Krzysztof Kuznik <k.kuznik@avsystem.com>
file.c

diff --git a/file.c b/file.c
index c69a297323132428c0ab16faf48a75a01d9a4981..d104933e8d4f9fb30d7380c72a1a39938bca75f2 100644 (file)
--- a/file.c
+++ b/file.c
@@ -837,9 +837,9 @@ static struct uci_package *uci_file_load(struct uci_context *ctx, const char *na
                break;
        }
 
+       UCI_TRAP_SAVE(ctx, done);
        file = uci_open_stream(ctx, filename, SEEK_SET, false, false);
        ctx->err = 0;
-       UCI_TRAP_SAVE(ctx, done);
        UCI_INTERNAL(uci_import, ctx, file, name, &package, true);
        UCI_TRAP_RESTORE(ctx);
 
@@ -851,8 +851,10 @@ static struct uci_package *uci_file_load(struct uci_context *ctx, const char *na
 
 done:
        uci_close_stream(file);
-       if (ctx->err)
+       if (ctx->err) {
+               free(filename);
                UCI_THROW(ctx, ctx->err);
+       }
        return package;
 }