From: NeilBrown Date: Tue, 25 Feb 2014 03:59:12 +0000 (+1100) Subject: Assemble: re-arrange freeing of 'tst' in load_devices(). X-Git-Tag: mdadm-3.3.1~65 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=commitdiff_plain;h=9ee314dab91dc8479d2e981d0849ce777f7ea492 Assemble: re-arrange freeing of 'tst' in load_devices(). When we return in error, we need to free(tst), and ->free_super(tst); Sometimes we didn't. Also the final ->free_super(tst) should be followed by free(tst) but wasn't. Move that file free forward in the code a bit as we will want to use the tst there in the next patch. Signed-off-by: NeilBrown --- diff --git a/Assemble.c b/Assemble.c index af02633c..658df91d 100644 --- a/Assemble.c +++ b/Assemble.c @@ -572,6 +572,7 @@ static int load_devices(struct devs *devices, char *devmap, for (tmpdev = devlist; tmpdev; tmpdev=tmpdev->next) { char *devname = tmpdev->devname; struct stat stb; + struct supertype *tst; int i; if (tmpdev->used != 1) @@ -582,7 +583,6 @@ static int load_devices(struct devs *devices, char *devmap, int dfd; /* prepare useful information in info structures */ struct stat stb2; - struct supertype *tst; int err; fstat(mdfd, &stb2); @@ -611,6 +611,8 @@ static int load_devices(struct devs *devices, char *devmap, close(mdfd); free(devices); free(devmap); + tst->ss->free_super(tst); + free(tst); *stp = st; return -1; } @@ -660,15 +662,13 @@ static int load_devices(struct devs *devices, char *devmap, else bitmap_done = 1; } - tst->ss->free_super(tst); } else #endif { - struct supertype *tst = dup_super(st); - int dfd; - dfd = dev_open(devname, - tmpdev->disposition == 'I' - ? O_RDWR : (O_RDWR|O_EXCL)); + int dfd = dev_open(devname, + tmpdev->disposition == 'I' + ? O_RDWR : (O_RDWR|O_EXCL)); + tst = dup_super(st); if (dfd < 0 || tst->ss->load_super(tst, dfd, NULL) != 0) { pr_err("cannot re-read metadata from %s - aborting\n", @@ -678,11 +678,12 @@ static int load_devices(struct devs *devices, char *devmap, close(mdfd); free(devices); free(devmap); + tst->ss->free_super(tst); + free(tst); *stp = st; return -1; } tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks); - tst->ss->free_super(tst); close(dfd); } @@ -705,6 +706,8 @@ static int load_devices(struct devs *devices, char *devmap, > devices[most_recent].i.events) most_recent = devcnt; } + tst->ss->free_super(tst); + free(tst); if (content->array.level == LEVEL_MULTIPATH) /* with multipath, the raid_disk from the superblock is meaningless */