common/messaging: Don't forget to free the result returned by tdb_fetch()
authorAmitay Isaacs <amitay@gmail.com>
Tue, 2 Apr 2013 05:57:51 +0000 (16:57 +1100)
committerAmitay Isaacs <amitay@gmail.com>
Fri, 5 Apr 2013 02:00:16 +0000 (13:00 +1100)
This fixes a memory leak in the messaging code.

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
common/ctdb_message.c

index 2152c88dc9aa42533b797e7afb2a261de546f7c2..297f86ba25b6847f0891b1e3e6d1cdbf312896c4 100644 (file)
@@ -110,6 +110,7 @@ int ctdb_dispatch_message(struct ctdb_context *ctdb, uint64_t srvid, TDB_DATA da
        ret = message_list_db_fetch(ctdb, key, &hdata);
        if (ret == 0) {
                h = *(struct ctdb_message_list_header **)hdata.dptr;
+               free(hdata.dptr);
 
                for (m=h->m; m; m=m->next) {
                        m->message_handler(ctdb, srvid, data, m->message_private);
@@ -122,6 +123,7 @@ int ctdb_dispatch_message(struct ctdb_context *ctdb, uint64_t srvid, TDB_DATA da
        ret = message_list_db_fetch(ctdb, key, &hdata);
        if (ret == 0) {
                h = *(struct ctdb_message_list_header **)hdata.dptr;
+               free(hdata.dptr);
 
                for(m=h->m; m; m=m->next) {
                        m->message_handler(ctdb, srvid, data, m->message_private);
@@ -227,6 +229,7 @@ int ctdb_register_message_handler(struct ctdb_context *ctdb,
                talloc_set_destructor(h, message_header_destructor);
        } else {
                h = *(struct ctdb_message_list_header **)data.dptr;
+               free(data.dptr);
        }
 
        m->h = h;
@@ -255,6 +258,8 @@ int ctdb_deregister_message_handler(struct ctdb_context *ctdb, uint64_t srvid, v
        }
 
        h = *(struct ctdb_message_list_header **)data.dptr;
+       free(data.dptr);
+
        for (m=h->m; m; m=m->next) {
                if (m->message_private == private_data) {
                        talloc_free(m);
@@ -282,6 +287,7 @@ bool ctdb_check_message_handler(struct ctdb_context *ctdb, uint64_t srvid)
        }
 
        h = *(struct ctdb_message_list_header **)data.dptr;
+       free(data.dptr);
        if (h->m == NULL) {
                return false;
        }