summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2008-05-27 17:23:16 +1000
committerNeil Brown <neilb@suse.de>2008-05-27 17:23:16 +1000
commit3d2b16e77caf3242162e1470371c7a21e1f50711 (patch)
tree153e63262ff1910f3ebec346aab4bc73b507c9e3
parentfe2979bd165863cb9cac4f8ee39ce1cdea70191d (diff)
downloadmdadm-3d2b16e77caf3242162e1470371c7a21e1f50711.tar.gz
mdadm-3d2b16e77caf3242162e1470371c7a21e1f50711.tar.xz
mdadm-3d2b16e77caf3242162e1470371c7a21e1f50711.zip
Avoid NULL reference calling free_super and elsewhere.
Since we made free_super a superswitch call, we need to be careful that st is non NULL before calling st->ss->free_super(st). Also when updating byteorder there is a chance of a similar NULL deref.
-rw-r--r--Assemble.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/Assemble.c b/Assemble.c
index 5ed2dc1..36b2304 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -367,7 +367,8 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
tmpdev->used = 1;
loop:
- tst->ss->free_super(tst);
+ if (tst)
+ tst->ss->free_super(tst);
}
if (mdfd < 0) {
@@ -568,17 +569,18 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
devcnt++;
}
- if (update && strcmp(update, "byteorder")==0)
- st->minor_version = 90;
-
if (devcnt == 0) {
fprintf(stderr, Name ": no devices found for %s\n",
mddev);
- st->ss->free_super(st);
+ if (st)
+ st->ss->free_super(st);
if (must_close) close(mdfd);
return 1;
}
+ if (update && strcmp(update, "byteorder")==0)
+ st->minor_version = 90;
+
st->ss->getinfo_super(st, &info);
clean = info.array.state & 1;