diff --git a/sys/dev/disk/nata/ata-raid.c b/sys/dev/disk/nata/ata-raid.c --- a/sys/dev/disk/nata/ata-raid.c +++ b/sys/dev/disk/nata/ata-raid.c @@ -1858,6 +1858,10 @@ } raid->format |= AR_F_HPTV2_RAID; + if (disk_number >= MAX_DISKS) { + device_printf(parent, "Highpoint (v2) metadata disk_number %d out of range\n", disk_number); + goto hptv2_out; + } raid->disks[disk_number].dev = parent; raid->disks[disk_number].flags = (AR_DF_PRESENT | AR_DF_ASSIGNED); raid->lun = array; @@ -2100,6 +2104,10 @@ raid->lun = array; strncpy(raid->name, meta->name, min(sizeof(raid->name), sizeof(meta->name))); + if (disk_number >= MAX_DISKS) { + device_printf(parent, "Highpoint (v3) metadata disk_number %d out of range\n", disk_number); + goto hptv3_out; + } raid->disks[disk_number].sectors = raid->total_sectors / (raid->type == AR_T_RAID5 ? raid->width - 1 : raid->width); raid->disks[disk_number].dev = parent; @@ -2863,6 +2871,10 @@ raid->lun = array; if (meta->configs[conf_entry].disk.device != LSIV2_D_NONE) { + if (meta->disk_number >= MAX_DISKS) { + device_printf(parent, "LSI (v2) metadata disk_number %d out of range\n", meta->disk_number); + goto lsiv2_out; + } raid->disks[meta->disk_number].dev = parent; raid->disks[meta->disk_number].sectors = meta->configs[conf_entry].disk.disk_sectors; @@ -3118,6 +3130,10 @@ if (meta->status & NV_S_DEGRADED) raid->status |= AR_S_DEGRADED; + if (meta->disk_number >= MAX_DISKS) { + device_printf(parent, "nVidia metadata disk_number %d out of range\n", meta->disk_number); + goto nvidia_out; + } raid->disks[meta->disk_number].dev = parent; raid->disks[meta->disk_number].sectors = raid->total_sectors / raid->width; @@ -3588,6 +3604,10 @@ int disk_number = (raid->type == AR_T_RAID01) ? meta->raid1_ident + (meta->raid0_ident << 1) : meta->disk_number; + if (disk_number >= MAX_DISKS) { + device_printf(parent, "SiI metadata disk_number %d out of range\n", disk_number); + goto sii_out; + } raid->disks[disk_number].dev = parent; raid->disks[disk_number].sectors =