From 89a10d84cb76492b7d8ea96d0a206b54702bcaff Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Thu, 8 Jan 2009 09:25:31 +1100 Subject: [PATCH 1/2] Free mdstat data structures properly. In one case we called 'free' instead of 'mdstat_free'. In others we didn't free at all. Signed-off-by: NeilBrown --- Monitor.c | 2 +- mapfile.c | 1 + mdadm.c | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Monitor.c b/Monitor.c index abc2dbd..2f0fe0c 100644 --- a/Monitor.c +++ b/Monitor.c @@ -619,7 +619,7 @@ int Wait(char *dev) free_mdstat(ms); return rv; } - free(ms); + free_mdstat(ms); rv = 0; mdstat_wait(5); } diff --git a/mapfile.c b/mapfile.c index 0d0aa39..59cc6c6 100644 --- a/mapfile.c +++ b/mapfile.c @@ -245,6 +245,7 @@ void RebuildMap(void) break; } } + free_mdstat(mdstat); map_write(map); map_free(map); } diff --git a/mdadm.c b/mdadm.c index d680ea7..6609bf2 100644 --- a/mdadm.c +++ b/mdadm.c @@ -1217,6 +1217,7 @@ int main(int argc, char *argv[]) export, test, homehost); put_md_name(name); } + free_mdstat(ms); } else if (devmode == 'S' && scan) { /* apply --stop to all devices in /proc/mdstat */ /* Due to possible stacking of devices, repeat until @@ -1249,6 +1250,7 @@ int main(int argc, char *argv[]) put_md_name(name); } + free_mdstat(ms); } while (!last && err); if (err) rv |= 1; } else { From 1a0ee0baf049809f9e67d60bb8158801eada3bd5 Mon Sep 17 00:00:00 2001 From: Dustin Kirkland Date: Thu, 8 Jan 2009 09:25:33 +1100 Subject: [PATCH 2/2] Fail overtly when asprintf fails to allocate memory .. rather that causing a less-obvious violation of segments. Signed-off-by: NeilBrown --- Assemble.c | 4 ++-- config.c | 2 +- mdadm.h | 11 +++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Assemble.c b/Assemble.c index 0cdeeda..ab8faed 100644 --- a/Assemble.c +++ b/Assemble.c @@ -386,9 +386,9 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, if (c) c++; else c= info.name; if (isdigit(*c) && ((ident->autof & 7)==4 || (ident->autof&7)==6)) /* /dev/md/d0 style for partitionable */ - asprintf(&mddev, "/dev/md/d%s", c); + xasprintf(&mddev, "/dev/md/d%s", c); else - asprintf(&mddev, "/dev/md/%s", c); + xasprintf(&mddev, "/dev/md/%s", c); mdfd = open_mddev(mddev, ident->autof); if (mdfd < 0) { st->ss->free_super(st); diff --git a/config.c b/config.c index 121b337..78bbb9d 100644 --- a/config.c +++ b/config.c @@ -559,7 +559,7 @@ void mailfromline(char *line) alert_mail_from = strdup(w); else { char *t= NULL; - asprintf(&t, "%s %s", alert_mail_from, w); + xasprintf(&t, "%s %s", alert_mail_from, w); free(alert_mail_from); alert_mail_from = t; } diff --git a/mdadm.h b/mdadm.h index bc4b38e..b0a8c5e 100644 --- a/mdadm.h +++ b/mdadm.h @@ -528,6 +528,17 @@ extern int open_mddev(char *dev, int autof); extern int open_mddev_devnum(char *devname, int devnum, char *name, char *chosen_name, int parts); +#include +#include +static inline int xasprintf(char **strp, const char *fmt, ...) { + va_list ap; + int ret; + va_start(ap, fmt); + ret = asprintf(strp, fmt, ap); + va_end(ap); + assert(ret >= 0); + return ret; +} #define LEVEL_MULTIPATH (-4) #define LEVEL_LINEAR (-1)