]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Ensure mddev_dev struct always zeroed on allocation.
authorNeilBrown <neilb@suse.de>
Tue, 5 Mar 2013 00:53:51 +0000 (11:53 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 5 Mar 2013 00:53:51 +0000 (11:53 +1100)
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 <neilb@suse.de>
Manage.c
config.c

index c7738e1e80b9b2df0802d70e3789f695c1fcd114..e3d30412ad0324f5a1809b7322e34d861b4dc9ae 100644 (file)
--- 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);
        }
 }
 
index 0eb2c8d1c7f7275cb8ff0b275733be8bb568ffbe..798338fbda663df06f717115aa75617d66f09eb6 100644 (file)
--- 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; i<globbuf.gl_pathc; i++) {
                        struct mddev_dev *t = xmalloc(sizeof(*t));
+                       memset(t, 0, sizeof(*t));
                        t->devname = xstrdup(globbuf.gl_pathv[i]);
                        t->next = dlist;
-                       t->used = 0;
                        dlist = t;
 /*     printf("one dev is %s\n", t->devname);*/
                }