--- /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;