diff mbox

[ovs-dev,1/4] ovsdb-client: fix memory leak reported by valgrind

Message ID 1450981722-101437-1-git-send-email-u9012063@gmail.com
State Changes Requested
Headers show

Commit Message

William Tu Dec. 24, 2015, 6:28 p.m. UTC
Free memory allocated from table_add_column and table_add_row. Call
stack is below:
    xrealloc (util.c:123)
    table_add_column (table.c:146) or table_add_row (table.c:172)
    do_list_tables (ovsdb-client.c:449)
    main (ovsdb-client.c:151)

Signed-off-by: William Tu <u9012063@gmail.com>
Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com>
Co-authored-by: Daniele Di Proietto <diproiettod@vmware.com>
---
 ovsdb/ovsdb-client.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

Comments

Ben Pfaff Jan. 4, 2016, 8:31 p.m. UTC | #1
On Thu, Dec 24, 2015 at 10:28:39AM -0800, William Tu wrote:
> Free memory allocated from table_add_column and table_add_row. Call
> stack is below:
>     xrealloc (util.c:123)
>     table_add_column (table.c:146) or table_add_row (table.c:172)
>     do_list_tables (ovsdb-client.c:449)
>     main (ovsdb-client.c:151)
> 
> Signed-off-by: William Tu <u9012063@gmail.com>
> Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com>
> Co-authored-by: Daniele Di Proietto <diproiettod@vmware.com>

Clang reports the following, and I think it's right:

../ovsdb/ovsdb-client.c:137:18: error: variable 'database' is uninitialized when
      used here [-Werror,-Wuninitialized]
            free(database);
                 ^~~~~~~~
../ovsdb/ovsdb-client.c:87:19: note: initialize the variable 'database' to
      silence this warning
    char *database;
                  ^
                   = NULL
diff mbox

Patch

diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c
index 83cc81d..cca1266 100644
--- a/ovsdb/ovsdb-client.c
+++ b/ovsdb/ovsdb-client.c
@@ -84,7 +84,7 @@  int
 main(int argc, char *argv[])
 {
     const struct ovsdb_client_command *command;
-    const char *database;
+    char *database;
     struct jsonrpc *rpc;
 
     ovs_cmdl_proctitle_init(argc, argv);
@@ -128,12 +128,14 @@  main(int argc, char *argv[])
         fetch_dbs(rpc, &dbs);
         if (argc - optind > command->min_args
             && svec_contains(&dbs, argv[optind])) {
-            database = argv[optind++];
+            database = xstrdup(argv[optind++]);
         } else if (dbs.n == 1) {
             database = xstrdup(dbs.names[0]);
         } else if (svec_contains(&dbs, "Open_vSwitch")) {
-            database = "Open_vSwitch";
+            database = xstrdup("Open_vSwitch");
         } else {
+            free(database);
+            jsonrpc_close(rpc);
             ovs_fatal(0, "no default database for `%s' command, please "
                       "specify a database name", command->name);
         }
@@ -150,6 +152,7 @@  main(int argc, char *argv[])
 
     command->handler(rpc, database, argc - optind, argv + optind);
 
+    free(database);
     jsonrpc_close(rpc);
 
     if (ferror(stdout)) {
@@ -455,6 +458,7 @@  do_list_tables(struct jsonrpc *rpc, const char *database,
     }
     ovsdb_schema_destroy(schema);
     table_print(&t, &table_style);
+    table_destroy(&t);
 }
 
 static void
@@ -493,6 +497,7 @@  do_list_columns(struct jsonrpc *rpc, const char *database,
     }
     ovsdb_schema_destroy(schema);
     table_print(&t, &table_style);
+    table_destroy(&t);
 }
 
 static void