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