]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Incremental - avoid NULL dereference.
authorNeilBrown <neilb@suse.de>
Tue, 7 Apr 2009 07:54:09 +0000 (17:54 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 7 Apr 2009 07:54:09 +0000 (17:54 +1000)
There structure returned by sysfs_read might not have any 'devs',
don't assume it does.

Signed-off-by: NeilBrown <neilb@suse.de>
Incremental.c

index 1e74da6d06bf3d3921be0970aed145d6f54f7a81..f7e602ec4e697b31b0cbf0dfa081f902e507fcb1 100644 (file)
@@ -335,32 +335,34 @@ int Incremental(char *devname, int verbose, int runstop,
 
                sra = sysfs_read(mdfd, fd2devnum(mdfd), (GET_DEVS | GET_STATE));
 
-               sprintf(dn, "%d:%d", sra->devs->disk.major,
-                       sra->devs->disk.minor);
-               dfd2 = dev_open(dn, O_RDONLY);
-               st2 = dup_super(st);
-               if (st2->ss->load_super(st2, dfd2, NULL) ||
-                   st->ss->compare_super(st, st2) != 0) {
-                       fprintf(stderr, Name
-                               ": metadata mismatch between %s and "
-                               "chosen array %s\n",
-                               devname, chosen_name);
-                       close(mdfd);
+               if (sra->devs) {
+                       sprintf(dn, "%d:%d", sra->devs->disk.major,
+                               sra->devs->disk.minor);
+                       dfd2 = dev_open(dn, O_RDONLY);
+                       st2 = dup_super(st);
+                       if (st2->ss->load_super(st2, dfd2, NULL) ||
+                           st->ss->compare_super(st, st2) != 0) {
+                               fprintf(stderr, Name
+                                       ": metadata mismatch between %s and "
+                                       "chosen array %s\n",
+                                       devname, chosen_name);
+                               close(mdfd);
+                               close(dfd2);
+                               return 2;
+                       }
                        close(dfd2);
-                       return 2;
-               }
-               close(dfd2);
-               memset(&info2, 0, sizeof(info2));
-               st2->ss->getinfo_super(st2, &info2);
-               st2->ss->free_super(st2);
-               if (info.array.level != info2.array.level ||
-                   memcmp(info.uuid, info2.uuid, 16) != 0 ||
-                   info.array.raid_disks != info2.array.raid_disks) {
-                       fprintf(stderr, Name
-                               ": unexpected difference between %s and %s.\n",
-                               chosen_name, devname);
-                       close(mdfd);
-                       return 2;
+                       memset(&info2, 0, sizeof(info2));
+                       st2->ss->getinfo_super(st2, &info2);
+                       st2->ss->free_super(st2);
+                       if (info.array.level != info2.array.level ||
+                           memcmp(info.uuid, info2.uuid, 16) != 0 ||
+                           info.array.raid_disks != info2.array.raid_disks) {
+                               fprintf(stderr, Name
+                                       ": unexpected difference between %s and %s.\n",
+                                       chosen_name, devname);
+                               close(mdfd);
+                               return 2;
+                       }
                }
                info2.disk.major = major(stb.st_rdev);
                info2.disk.minor = minor(stb.st_rdev);