⬢ DragonFlyBSD Kernel Audit
DF-2485 / fix.diff
← back to finding ↓ download raw
--- /home/maxx/dfbsd/dfbsd/sys/dev/disk/mpt/mpt_raid.c	2026-06-29 12:51:18.000000000 +0000
+++ /tmp/opencode/fixtree/sys/dev/disk/mpt/mpt_raid.c	2026-10-24 09:21:10.099602939 +0000
@@ -848,7 +848,15 @@
 		return (0);
 	}
 	ioc_vol = mpt->ioc_page2->RaidVolume;
-	ioc_last_vol = ioc_vol + mpt->ioc_page2->NumActiveVolumes;
+	{
+		u_int nvol = mpt->ioc_page2->NumActiveVolumes;
+		u_int nvmax = (mpt->ioc_page2->Header.PageLength *
+		    sizeof(uint32_t) - sizeof(*mpt->ioc_page2)) /
+		    sizeof(ioc_vol[0]);
+		if (nvol > nvmax)
+			nvol = nvmax;
+		ioc_last_vol = ioc_vol + nvol;
+	}
 	for (;ioc_vol != ioc_last_vol; ioc_vol++) {
 		if (ioc_vol->VolumeID == tgt) {
 			return (1);
@@ -1146,7 +1154,13 @@
 		mpt_prtc(mpt, "\n");
 	}
 	mpt_vol_prt(mpt, mpt_vol, "%d Members:\n", vol_pg->NumPhysDisks);
-	for (i = 0; i < vol_pg->NumPhysDisks; i++){
+	{
+		u_int ndisk = vol_pg->NumPhysDisks;
+		u_int ndmax = (vol_pg->Header.PageLength * sizeof(uint32_t)
+		    - sizeof(*vol_pg)) / sizeof(vol_pg->PhysDisk[0]);
+		if (ndisk > ndmax)
+			ndisk = ndmax;
+	for (i = 0; i < ndisk; i++){
 		struct mpt_raid_disk *mpt_disk;
 		CONFIG_PAGE_RAID_PHYS_DISK_0 *disk_pg;
 		int pt_bus = cam_sim_bus(mpt->phydisk_sim);
@@ -1210,8 +1224,8 @@
 		}
 		mpt_prtc(mpt, "\n");
 	}
+	}
 }
-
 static void
 mpt_announce_disk(struct mpt_softc *mpt, struct mpt_raid_disk *mpt_disk)
 {
@@ -1398,7 +1412,15 @@
 	mpt2host_config_page_ioc3(mpt->ioc_page3);
 
 	ioc_disk = mpt->ioc_page3->PhysDisk;
-	ioc_last_disk = ioc_disk + mpt->ioc_page3->NumPhysDisks;
+	{
+		u_int ndisk = mpt->ioc_page3->NumPhysDisks;
+		u_int ndmax = (mpt->ioc_page3->Header.PageLength *
+		    sizeof(uint32_t) - sizeof(*mpt->ioc_page3)) /
+		    sizeof(ioc_disk[0]);
+		if (ndisk > ndmax)
+			ndisk = ndmax;
+		ioc_last_disk = ioc_disk + ndisk;
+	}
 	for (; ioc_disk != ioc_last_disk; ioc_disk++) {
 		struct mpt_raid_disk *mpt_disk;