Detail: Avoid dereferencing some NULL pointers.

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>
This commit is contained in:
NeilBrown 2014-08-06 15:56:12 +10:00
parent d13566f9b6
commit c9f1cbc050
1 changed files with 3 additions and 3 deletions

View File

@ -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");
}