From 0329281b49d4f7208f4e6693e560add6c1154130 Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Thu, 19 Apr 2007 19:10:19 +0000 Subject: [PATCH] Fix libdevmapper-event memory leaks --- WHATS_NEW_DM | 1 + daemons/dmeventd/libdevmapper-event.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM index 87e3ed507..67e004f5e 100644 --- a/WHATS_NEW_DM +++ b/WHATS_NEW_DM @@ -1,5 +1,6 @@ Version 1.02.19 - ==================================== + Fix libdevmapper-event memory leaks Remove unnecessary memset() return value checks. Fix a few leaks in reporting error paths. [1.02.15+] diff --git a/daemons/dmeventd/libdevmapper-event.c b/daemons/dmeventd/libdevmapper-event.c index d2f8ac503..fa59bd489 100644 --- a/daemons/dmeventd/libdevmapper-event.c +++ b/daemons/dmeventd/libdevmapper-event.c @@ -359,10 +359,17 @@ static int _daemon_talk(struct dm_event_fifos *fifos, */ if (!_daemon_write(fifos, msg)) { stack; + dm_free(msg->data); + msg->data = 0; return -EIO; } do { + + if (msg->data) + dm_free(msg->data); + msg->data = 0; + if (!_daemon_read(fifos, msg)) { stack; return -EIO; @@ -548,6 +555,11 @@ static int _do_event(int cmd, struct dm_event_daemon_message *msg, } ret = _daemon_talk(&fifos, msg, DM_EVENT_CMD_HELLO, 0, 0, 0, 0); + + if (msg->data) + dm_free(msg->data); + msg->data = 0; + if (!ret) ret = _daemon_talk(&fifos, msg, cmd, dso_name, dev_name, evmask, timeout); @@ -714,6 +726,12 @@ int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next) dm_event_handler_set_dso(dmevh, reply_dso); dm_event_handler_set_event_mask(dmevh, reply_mask); + + if (reply_dso) + dm_free(reply_dso); + if (reply_uuid) + dm_free(reply_uuid); + dmevh->dev_name = dm_strdup(dm_task_get_name(dmt)); if (!dmevh->dev_name) { ret = -ENOMEM; @@ -736,6 +754,10 @@ int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next) fail: if (msg.data) dm_free(msg.data); + if (reply_dso) + dm_free(reply_dso); + if (reply_uuid) + dm_free(reply_uuid); _dm_event_handler_clear_dev_info(dmevh); dm_task_destroy(dmt); return ret;