summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Ledford <dledford@redhat.com>2008-10-29 10:50:48 -0400
committerDoug Ledford <dledford@redhat.com>2008-10-29 10:50:48 -0400
commitfb26614d7a69d164f9e401f57389a1ca4e84258f (patch)
tree6f0f0b55dada1adccd446bcc40e0bf63570944b1
parentce1a9e3cfca9342080fe66a1352acd1671a49261 (diff)
downloadmdadm-fb26614d7a69d164f9e401f57389a1ca4e84258f.tar.gz
mdadm-fb26614d7a69d164f9e401f57389a1ca4e84258f.tar.xz
mdadm-fb26614d7a69d164f9e401f57389a1ca4e84258f.zip
Fix NULL pointer oops
RAID10 is the only raid level that uses the avail char array pointer during the enough() operation, so it was the only one that saw this. The code in incremental assumes unconditionally that count_active will allocate the avail char array, that it might be used by enough, and that it will need to be freed afterward. Once you make count_active actually do that, then the oops goes away. Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--Incremental.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/Incremental.c b/Incremental.c
index 0fb9afd..9c6524f 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -543,12 +543,18 @@ static int count_active(struct supertype *st, int mdfd, char **availp,
if (ok != 0)
continue;
st->ss->getinfo_super(st, &info);
+ if (!avail) {
+ avail = malloc(info.array.raid_disks);
+ if (!avail) {
+ fprintf(stderr, Name ": out of memory.\n");
+ exit(1);
+ }
+ memset(avail, 0, info.array.raid_disks);
+ *availp = avail;
+ }
+
if (info.disk.state & (1<<MD_DISK_SYNC))
{
- if (avail == NULL) {
- avail = malloc(info.array.raid_disks);
- memset(avail, 0, info.array.raid_disks);
- }
if (cnt == 0) {
cnt++;
max_events = info.events;