--- a/sys/dev/disk/nata/ata-raid.c 2026-10-12 11:09:18.188826844 +0000 +++ b/sys/dev/disk/nata/ata-raid.c 2026-10-12 11:09:18.180826948 +0000 @@ -1007,6 +1007,10 @@ if (!(rdp = ata_raid_arrays[status->lun])) return ENXIO; + if (rdp->total_disks > MAX_DISKS) { + rdp->total_disks = MAX_DISKS; + return EINVAL; + } status->type = rdp->type; status->total_disks = rdp->total_disks; @@ -1045,6 +1049,10 @@ if (array >= MAX_ARRAYS) return ENOSPC; + if (config->total_disks < 1 || config->total_disks > MAX_DISKS) { + return EINVAL; + } + rdp = (struct ar_softc*)kmalloc(sizeof(struct ar_softc), M_AR, M_WAITOK | M_ZERO); @@ -2792,6 +2800,13 @@ goto lsiv2_out; } + /* DF-2494: untrusted indices bound the global raidp[]/disks[] tables */ + if (meta->raid_number >= MAX_ARRAYS || meta->disk_number >= MAX_DISKS) { + if (testing || bootverbose) + device_printf(parent, "LSI (v2) invalid raid/disk number\n"); + goto lsiv2_out; + } + if (testing || bootverbose) ata_raid_lsiv2_print_meta(meta); @@ -2854,6 +2869,13 @@ raid->format = AR_F_LSIV2_RAID; raid->generation = 0; raid->total_disks = meta->configs[raid_entry].raid.disk_count; + if (raid->total_disks > MAX_DISKS) { + device_printf(parent, "LSI (v2) invalid disk count %u\n", + raid->total_disks); + kfree(raid, M_AR); + raidp[array] = NULL; + goto lsiv2_out; + } raid->total_sectors = meta->configs[raid_entry].raid.total_sectors; raid->heads = 255; raid->sectors = 63;