]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Manage_runstop(): Avoid memory leak
authorJes Sorensen <Jes.Sorensen@redhat.com>
Tue, 1 Nov 2011 15:09:31 +0000 (16:09 +0100)
committerNeilBrown <neilb@suse.de>
Tue, 1 Nov 2011 23:48:53 +0000 (10:48 +1100)
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Manage.c

index 39a9b2001feed881bef62bfd1c87c10d2e1852ca..d5110a71890457c0f9c081c939dda9d78c6bc213 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -183,6 +183,7 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet)
         * quiet < 0 means we will try again if it fails.
         */
        mdu_param_t param; /* unused */
+       int rv = 0;
 
        if (runstop == -1 && md_get_version(fd) < 9000) {
                if (ioctl(fd, STOP_MD, 0)) {
@@ -261,7 +262,8 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet)
                                fprintf(stderr, Name
                                        ": failed to stop array %s: %s\n",
                                        devname, strerror(errno));
-                               return 1;
+                               rv = 1;
+                               goto out;
                        }
 
                        /* Give monitor a chance to act */
@@ -273,7 +275,8 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet)
                                        ": failed to completely stop %s"
                                        ": Device is busy\n",
                                        devname);
-                               return 1;
+                               rv = 1;
+                               goto out;
                        }
                } else if (mdi &&
                           mdi->array.major_version == -1 &&
@@ -301,9 +304,8 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet)
                                                        "member %s still active\n",
                                                        devname, m->dev);
                                        free_mdstat(mds);
-                                       if (mdi)
-                                               sysfs_free(mdi);
-                                       return 1;
+                                       rv = 1;
+                                       goto out;
                                }
                }
 
@@ -328,9 +330,8 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet)
                                                "process, mounted filesystem "
                                                "or active volume group?\n");
                        }
-                       if (mdi)
-                               sysfs_free(mdi);
-                       return 1;
+                       rv = 1;
+                       goto out;
                }
                /* prior to 2.6.28, KOBJ_CHANGE was not sent when an md array
                 * was stopped, so We'll do it here just to be sure.  Drop any
@@ -355,8 +356,11 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet)
                map_lock(&map);
                map_remove(&map, devnum);
                map_unlock(&map);
+       out:
+               if (mdi)
+                       sysfs_free(mdi);
        }
-       return 0;
+       return rv;
 }
 
 int Manage_resize(char *devname, int fd, long long size, int raid_disks)