]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Detail: Avoid dereferencing some NULL pointers.
authorNeilBrown <neilb@suse.de>
Wed, 6 Aug 2014 05:56:12 +0000 (15:56 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 6 Aug 2014 05:56:12 +0000 (15:56 +1000)
dm devices which only have a single underlying md device
will respond to md ioctls  as though they were that md device.
This can confuse mdadm and lead it to violating its segments.

So add tests for NULL where appropriate.  You might not get exactly
the right answer when you "mdadm -D" a dm device, but at least it won't
crash now.

Reported-by: Willy Weisz <Willy.Weisz@univie.ac.at>
Resolves: https://bugzilla.novell.com/show_bug.cgi?id=887821
Signed-off-by: NeilBrown <neilb@suse.de>
Detail.c

index 6d13d3a39f23d11f4c2e5d731b4e9bcff2c3a758..c4fcad9620ba30aa2db22251dc9a9a5a6af1c29c 100644 (file)
--- a/Detail.c
+++ b/Detail.c
@@ -109,7 +109,7 @@ int Detail(char *dev, struct context *c)
        st = super_by_fd(fd, &subarray);
        if (ioctl(fd, GET_ARRAY_INFO, &array) == 0) {
                inactive = 0;
-       } else if (errno == ENODEV) {
+       } else if (errno == ENODEV && sra) {
                array = sra->array;
                inactive = 1;
        } else {
@@ -465,8 +465,8 @@ int Detail(char *dev, struct context *c)
                               (!e || (e->percent < 0 && e->percent != RESYNC_PENDING &&
                               e->percent != RESYNC_DELAYED)) ? "" : sync_action[e->resync],
                               larray_size ? "": ", Not Started",
-                              e->percent == RESYNC_DELAYED ? " (DELAYED)": "",
-                              e->percent == RESYNC_PENDING ? " (PENDING)": "");
+                              (e && e->percent == RESYNC_DELAYED) ? " (DELAYED)": "",
+                              (e && e->percent == RESYNC_PENDING) ? " (PENDING)": "");
                } else if (inactive) {
                        printf("          State : inactive\n");
                }