[lvm-devel] master - libdm: avoid leak if dm_task_set_* fn called again

Alasdair Kergon agk at fedoraproject.org
Wed Sep 18 00:26:29 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=a0ca2c11ee69b51a99644955cb4daa8ca50c8034
Commit:        a0ca2c11ee69b51a99644955cb4daa8ca50c8034
Parent:        a3a5f58c21edba308dd8ced15860e52b5b902890
Author:        Alasdair G Kergon <agk at redhat.com>
AuthorDate:    Wed Sep 18 01:13:06 2013 +0100
Committer:     Alasdair G Kergon <agk at redhat.com>
CommitterDate: Wed Sep 18 01:13:06 2013 +0100

libdm: avoid leak if dm_task_set_* fn called again

(Mikulas)
---
 WHATS_NEW_DM              |    1 +
 libdm/ioctl/libdm-iface.c |    3 +++
 libdm/libdm-common.c      |    1 +
 3 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index f5d7dc2..252f105 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
 Version 1.02.80 - 
 ==================================
+  Free any previously-set string if a dm_task_set_* function is called again.
   Do not allow passing empty new name for dmsetup rename.
   Display any output returned by 'dmsetup message'.
   Add dm_task_get_message_response to libdevmapper.
diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c
index b0a2228..c530bb7 100644
--- a/libdm/ioctl/libdm-iface.c
+++ b/libdm/ioctl/libdm-iface.c
@@ -785,6 +785,7 @@ int dm_task_set_newuuid(struct dm_task *dmt, const char *newuuid)
 		newuuid = mangled_uuid;
 	}
 
+	dm_free(dmt->newname);
 	if (!(dmt->newname = dm_strdup(newuuid))) {
 		log_error("dm_task_set_newuuid: strdup(%s) failed", newuuid);
 		return 0;
@@ -796,6 +797,7 @@ int dm_task_set_newuuid(struct dm_task *dmt, const char *newuuid)
 
 int dm_task_set_message(struct dm_task *dmt, const char *message)
 {
+	dm_free(dmt->message);
 	if (!(dmt->message = dm_strdup(message))) {
 		log_error("dm_task_set_message: strdup failed");
 		return 0;
@@ -814,6 +816,7 @@ int dm_task_set_sector(struct dm_task *dmt, uint64_t sector)
 int dm_task_set_geometry(struct dm_task *dmt, const char *cylinders, const char *heads,
 			 const char *sectors, const char *start)
 {
+	dm_free(dmt->geometry);
 	if (dm_asprintf(&(dmt->geometry), "%s %s %s %s",
 			cylinders, heads, sectors, start) < 0) {
 		log_error("dm_task_set_geometry: sprintf failed");
diff --git a/libdm/libdm-common.c b/libdm/libdm-common.c
index c0669cb..b66911c 100644
--- a/libdm/libdm-common.c
+++ b/libdm/libdm-common.c
@@ -720,6 +720,7 @@ int dm_task_set_newname(struct dm_task *dmt, const char *newname)
 		newname = mangled_name;
 	}
 
+	dm_free(dmt->newname);
 	if (!(dmt->newname = dm_strdup(newname))) {
 		log_error("dm_task_set_newname: strdup(%s) failed", newname);
 		return 0;




More information about the lvm-devel mailing list