summaryrefslogtreecommitdiffstats
path: root/ctdb/common/ctdb_message.c
diff options
context:
space:
mode:
authorAmitay Isaacs <amitay@gmail.com>2013-04-02 16:57:51 +1100
committerAmitay Isaacs <amitay@gmail.com>2013-04-05 13:00:16 +1100
commit8788e6318c633f4a59da9dbf7ae8dfb0eee9be9c (patch)
treeed913cf87c83b1d54ba2a92a0a5bcf3af3608b2b /ctdb/common/ctdb_message.c
parent96ad89f438827b994ed841aca8a78bef4227da48 (diff)
downloadsamba-8788e6318c633f4a59da9dbf7ae8dfb0eee9be9c.tar.gz
samba-8788e6318c633f4a59da9dbf7ae8dfb0eee9be9c.tar.xz
samba-8788e6318c633f4a59da9dbf7ae8dfb0eee9be9c.zip
common/messaging: Don't forget to free the result returned by tdb_fetch()
This fixes a memory leak in the messaging code. Signed-off-by: Amitay Isaacs <amitay@gmail.com> (This used to be ctdb commit 20be1f991dd75c2333c9ec9db226432a819f57ba)
Diffstat (limited to 'ctdb/common/ctdb_message.c')
-rw-r--r--ctdb/common/ctdb_message.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/ctdb/common/ctdb_message.c b/ctdb/common/ctdb_message.c
index 2152c88dc9a..297f86ba25b 100644
--- a/ctdb/common/ctdb_message.c
+++ b/ctdb/common/ctdb_message.c
@@ -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;
}