summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2014-08-06 15:56:12 +1000
committerNeilBrown <neilb@suse.de>2014-08-06 15:56:12 +1000
commitc9f1cbc050eb52c058199c570864109afa0f1489 (patch)
treedc0a07a3351be1648d27514185cee2b07b79e5bf
parentd13566f9b6ff8377f45cd025a1cd1a58bcb4e857 (diff)
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>
-rw-r--r--Detail.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/Detail.c b/Detail.c
index 6d13d3a3..c4fcad96 100644
--- 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");
}