DragonFlyBSD Kernel Audit
DF-2484 / fix.diff
← back to finding ↓ download raw
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;