⬢ DragonFlyBSD Kernel Audit
DF-3709 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/raid/arcmsr/arcmsr.c
+++ b/sys/dev/raid/arcmsr/arcmsr.c
@@ -818,6 +818,13 @@
 		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0)); /*frame must be 32 bytes aligned*/
 		break;
 	case ACB_ADAPTER_TYPE_E:
+		/* flag_srb is a firmware-supplied SMID; only
+		 * indexes 0..ARCMSR_MAX_FREESRB_NUM-1 are valid */
+		if (flag_srb >= ARCMSR_MAX_FREESRB_NUM) {
+			kprintf("arcmsr%d: bogus completion SMID 0x%x\n",
+			    acb->pci_unit, flag_srb);
+			return;
+		}
 		srb = acb->psrb_pool[flag_srb];
 		break;
 	case ACB_ADAPTER_TYPE_A:
@@ -3579,6 +3586,11 @@
 		if (doneq_index >= acb->completionQ_entry)
 			doneq_index = 0;
 		acb->doneq_index = doneq_index;
+		if (cmdSMID >= ARCMSR_MAX_FREESRB_NUM) {
+			kprintf("arcmsr%d: bogus completion SMID 0x%x\n",
+			    acb->pci_unit, cmdSMID);
+			continue;
+		}
 		srb = acb->psrb_pool[cmdSMID];
 		error = (acb->pCompletionQ[doneq_index].cmdFlag & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
 		if (poll_srb != NULL)