diff --git a/sys/dev/disk/mpt/mpt_raid.c b/sys/dev/disk/mpt/mpt_raid.c --- a/sys/dev/disk/mpt/mpt_raid.c +++ b/sys/dev/disk/mpt/mpt_raid.c @@ -410,7 +410,8 @@ } mpt_disk = NULL; - if (raid_event->PhysDiskNum != 0xFF && mpt->raid_disks != NULL) { + if (raid_event->PhysDiskNum != 0xFF && mpt->raid_disks != NULL + && raid_event->PhysDiskNum < mpt->raid_max_disks) { mpt_disk = mpt->raid_disks + raid_event->PhysDiskNum; if ((mpt_disk->flags & MPT_RDF_ACTIVE) == 0) { mpt_disk = NULL; @@ -1152,6 +1153,8 @@ int pt_bus = cam_sim_bus(mpt->phydisk_sim); U8 f, s; + if (vol_pg->PhysDisk[i].PhysDiskNum >= mpt->raid_max_disks) + continue; mpt_disk = mpt->raid_disks + vol_pg->PhysDisk[i].PhysDiskNum; disk_pg = &mpt_disk->config_page; mpt_prtc(mpt, " "); @@ -1306,6 +1309,8 @@ /* Update disk entry array data. */ for (i = 0; i < vol_pg->NumPhysDisks; i++) { struct mpt_raid_disk *mpt_disk; + if (vol_pg->PhysDisk[i].PhysDiskNum >= mpt->raid_max_disks) + continue; mpt_disk = mpt->raid_disks + vol_pg->PhysDisk[i].PhysDiskNum; mpt_disk->volume = mpt_vol; mpt_disk->member_number = vol_pg->PhysDisk[i].PhysDiskMap; @@ -1402,6 +1407,8 @@ for (; ioc_disk != ioc_last_disk; ioc_disk++) { struct mpt_raid_disk *mpt_disk; + if (ioc_disk->PhysDiskNum >= mpt->raid_max_disks) + continue; mpt_disk = mpt->raid_disks + ioc_disk->PhysDiskNum; mpt_disk->flags |= MPT_RDF_REFERENCED; if ((mpt_disk->flags & (MPT_RDF_ACTIVE|MPT_RDF_UP2DATE)) @@ -1433,6 +1440,8 @@ for (;ioc_vol != ioc_last_vol; ioc_vol++) { struct mpt_raid_volume *mpt_vol; + if (ioc_vol->VolumePageNumber >= mpt->raid_max_volumes) + continue; mpt_vol = mpt->raid_volumes + ioc_vol->VolumePageNumber; mpt_vol->flags |= MPT_RVF_REFERENCED; vol_pg = mpt_vol->config_page;