]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
FIX: ping_monitor() usage causes memory leaks
authorAdam Kwolek <adam.kwolek@intel.com>
Fri, 18 Mar 2011 01:32:16 +0000 (12:32 +1100)
committerNeilBrown <neilb@suse.de>
Fri, 18 Mar 2011 01:32:16 +0000 (12:32 +1100)
When for ping_monitor() input devnum2devname() is used,
received string pointer should be passed to free() for memory release.
It is not made in several places. This use case should have function
to avoid memory leak.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Assemble.c
Create.c
Grow.c
Incremental.c
Manage.c
Monitor.c
msg.c
msg.h

index bfc879c7f4433550aa25e80dc1fd39156544582f..ee0346a52b0ffb26e81bef39536827610ffa65ec 100644 (file)
@@ -1598,7 +1598,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
                        if (!err) {
                                if (!mdmon_running(st->container_dev))
                                        start_mdmon(st->container_dev);
-                               ping_monitor(devnum2devname(st->container_dev));
+                               ping_monitor_by_id(st->container_dev);
                        }
                        break;
                }
index 6349f86538fd4cf4f6c59d10b49a70c572ece2e6..9f344256f6e72050c25b585d0fa8fe7d91af2096 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -929,7 +929,7 @@ int Create(struct supertype *st, char *mddev,
                        if (need_mdmon)
                                start_mdmon(st->container_dev);
 
-                       ping_monitor(devnum2devname(st->container_dev));
+                       ping_monitor_by_id(st->container_dev);
                        close(container_fd);
                }
                wait_for(chosen_name, mdfd);
diff --git a/Grow.c b/Grow.c
index 40e693edfbf3c6c39e655be17d674b4900bf9728..b6395850ac26270e41595ca8a149eaed4d448b8c 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -3416,7 +3416,7 @@ int Grow_continue(int mdfd, struct supertype *st, struct mdinfo *info,
 
                if (!mdmon_running(st->container_dev))
                        start_mdmon(st->container_dev);
-               ping_monitor(devnum2devname(st->container_dev));
+               ping_monitor_by_id(st->container_dev);
 
 
                if (info->reshape_active == 2) {
index 300bdca7a35ff4f800cadf03277ef2715f675306..721806075b344c6951283a7bb2b0c535db5da85f 100644 (file)
@@ -438,7 +438,7 @@ int Incremental(char *devname, int verbose, int runstop,
        /* 7/ Is there enough devices to possibly start the array? */
        /* 7a/ if not, finish with success. */
        if (info.array.level == LEVEL_CONTAINER) {
-               char *devname = NULL;
+               int devnum;
                /* Try to assemble within the container */
                map_unlock(&map);
                sysfs_uevent(&info, "change");
@@ -448,7 +448,7 @@ int Incremental(char *devname, int verbose, int runstop,
                                chosen_name, info.array.working_disks);
                wait_for(chosen_name, mdfd);
                if (st->ss->external)
-                       devname = devnum2devname(fd2devnum(mdfd));
+                       devnum = fd2devnum(mdfd);
                close(mdfd);
                sysfs_free(sra);
                rv = Incremental(chosen_name, verbose, runstop,
@@ -460,10 +460,8 @@ int Incremental(char *devname, int verbose, int runstop,
                        rv = 0;
                /* after spare is added, ping monitor for external metadata
                 * so that it can eg. try to rebuild degraded array */
-               if (st->ss->external) {
-                       ping_monitor(devname);
-                       free(devname);
-               }
+               if (st->ss->external)
+                       ping_monitor_by_id(devnum);
                return rv;
        }
 
index a679c24ce571d6550a28fc09099056a4793e37f8..5fd7014ab331771f50d002eb16051cade46ac4a6 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -932,7 +932,7 @@ int Manage_subdevs(char *devname, int fd,
                                        sysfs_free(sra);
                                        return 1;
                                }
-                               ping_monitor(devnum2devname(devnum));
+                               ping_monitor_by_id(devnum);
                                sysfs_free(sra);
                                close(container_fd);
                        } else {
index d3795b1713d8e07226c4f83666ce01459e7452e9..3f211b5b4cd152916b2456e47d737f6e3d245024 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -975,7 +975,7 @@ int Wait(char *dev)
                                if (is_subarray(&e->metadata_version[9]))
                                        ping_monitor(&e->metadata_version[9]);
                                else
-                                       ping_monitor(devnum2devname(devnum));
+                                       ping_monitor_by_id(devnum);
                        }
                        free_mdstat(ms);
                        return rv;
diff --git a/msg.c b/msg.c
index a1f4bc6e0b5540556549b08578f4190b9e1d704e..a10c930d45317f27e713c8b3212940f4b7572757 100644 (file)
--- a/msg.c
+++ b/msg.c
@@ -213,6 +213,20 @@ int ping_monitor(char *devname)
        return err;
 }
 
+/* ping monitor using device number */
+int ping_monitor_by_id(int devnum)
+{
+       int err = -1;
+       char *container = devnum2devname(devnum);
+
+       if (container) {
+               err = ping_monitor(container);
+               free(container);
+       }
+
+       return err;
+}
+
 static char *ping_monitor_version(char *devname)
 {
        int sfd = connect_monitor(devname);
diff --git a/msg.h b/msg.h
index 91a77987fe362e66d50b3a5de25fe9ec4341cb89..c6d037d99a3a2f37614bde047b193483622c5d5a 100644 (file)
--- a/msg.h
+++ b/msg.h
@@ -27,6 +27,7 @@ extern int ack(int fd, int tmo);
 extern int wait_reply(int fd, int tmo);
 extern int connect_monitor(char *devname);
 extern int ping_monitor(char *devname);
+extern int ping_monitor_by_id(int devnum);
 extern int block_subarray(struct mdinfo *sra);
 extern int unblock_subarray(struct mdinfo *sra, const int unfreeze);
 extern int block_monitor(char *container, const int freeze);