From 5e73b02409e55b1f8e48e7b933d97a73ff2e66d3 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 5 Mar 2013 11:53:51 +1100 Subject: Ensure mddev_dev struct always zeroed on allocation. There are a number of fields which should not be left uninitialised. e.g. attempt_re_add can get confused if ->writemostly is not set correctly. Signed-off-by: NeilBrown --- Manage.c | 28 ++++++++++++++-------------- config.c | 6 +++--- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Manage.c b/Manage.c index c7738e1e..e3d30412 100644 --- a/Manage.c +++ b/Manage.c @@ -359,6 +359,18 @@ int Manage_runstop(char *devname, int fd, int runstop, return rv; } +static struct mddev_dev *add_one(struct mddev_dev *dv, char *name, char disp) +{ + struct mddev_dev *new; + new = xmalloc(sizeof(*new)); + memset(new, 0, sizeof(*new)); + new->devname = xstrdup(name); + new->disposition = disp; + new->next = dv->next; + dv->next = new; + return new; +} + static void add_faulty(struct mddev_dev *dv, int fd, char disp) { mdu_array_info_t array; @@ -371,7 +383,6 @@ static void add_faulty(struct mddev_dev *dv, int fd, char disp) remaining_disks = array.nr_disks; for (i = 0; i < MAX_DISKS && remaining_disks > 0; i++) { - struct mddev_dev *new; char buf[40]; disk.number = i; if (ioctl(fd, GET_DISK_INFO, &disk) != 0) @@ -382,12 +393,7 @@ static void add_faulty(struct mddev_dev *dv, int fd, char disp) if ((disk.state & 1) == 0) /* not faulty */ continue; sprintf(buf, "%d:%d", disk.major, disk.minor); - new = xmalloc(sizeof(*new)); - new->devname = xstrdup(buf); - new->disposition = disp; - new->next = dv->next; - dv->next = new; - dv = new; + dv = add_one(dv, buf, disp); } } @@ -403,7 +409,6 @@ static void add_detached(struct mddev_dev *dv, int fd, char disp) remaining_disks = array.nr_disks; for (i = 0; i < MAX_DISKS && remaining_disks > 0; i++) { - struct mddev_dev *new; char buf[40]; int sfd; disk.number = i; @@ -424,12 +429,7 @@ static void add_detached(struct mddev_dev *dv, int fd, char disp) if (errno != ENXIO) /* Probably not detached */ continue; - new = xmalloc(sizeof(*new)); - new->devname = xstrdup(buf); - new->disposition = disp; - new->next = dv->next; - dv->next = new; - dv = new; + dv = add_one(dv, buf, disp); } } diff --git a/config.c b/config.c index 0eb2c8d1..798338fb 100644 --- a/config.c +++ b/config.c @@ -179,9 +179,9 @@ struct mddev_dev *load_partitions(void) if (!name) continue; d = xmalloc(sizeof(*d)); + memset(d, 0, sizeof(*d)); d->devname = xstrdup(name); d->next = rv; - d->used = 0; rv = d; } fclose(f); @@ -203,12 +203,12 @@ struct mddev_dev *load_containers(void) strncmp(ent->metadata_version, "external:", 9) == 0 && !is_subarray(&ent->metadata_version[9])) { d = xmalloc(sizeof(*d)); + memset(d, 0, sizeof(*d)); if (asprintf(&d->devname, "/dev/%s", ent->dev) < 0) { free(d); continue; } d->next = rv; - d->used = 0; rv = d; } free_mdstat(mdstat); @@ -884,9 +884,9 @@ struct mddev_dev *conf_get_devs() if (flags & GLOB_APPEND) { for (i=0; idevname = xstrdup(globbuf.gl_pathv[i]); t->next = dlist; - t->used = 0; dlist = t; /* printf("one dev is %s\n", t->devname);*/ } -- cgit v1.2.3