DragonFlyBSD Kernel Audit
DF-1429 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/raid/twe/twe.c b/sys/dev/raid/twe/twe.c
--- a/sys/dev/raid/twe/twe.c
+++ b/sys/dev/raid/twe/twe.c
@@ -1689,6 +1689,10 @@
     /* print attached drives */
     if (bootverbose) {
 	p[0] = twe_get_param(sc, TWE_PARAM_DRIVESUMMARY, TWE_PARAM_DRIVESUMMARY_Status, 16, NULL);
+	if (p[0] == NULL) {
+	    TWE_IO_UNLOCK(sc);
+	    return;
+	}
 	for (i = 0; i < ports; i++) {
 	    if (p[0]->data[i] != TWE_PARAM_DRIVESTATUS_Present)
 		continue;
@@ -1805,7 +1809,8 @@
 	return(msg);
 
     case 'c':
-	if ((child = sc->twe_drive[TWE_AEN_UNIT(aen)].td_disk) != NULL) {
+	if (TWE_AEN_UNIT(aen) < nitems(sc->twe_drive) &&
+	    (child = sc->twe_drive[TWE_AEN_UNIT(aen)].td_disk) != NULL) {
 	    ksnprintf(sc->twe_aen_buf, sizeof(sc->twe_aen_buf), "twed%d: %s",
 		device_get_unit(child), msg);
 	} else {
@@ -1859,15 +1864,15 @@
 	 */
 	switch (cmd->generic.flags) {
 	case 0x1b:
-	    device_printf(sc->twe_drive[cmd->generic.unit].td_disk,
+	    if (cmd->generic.unit < nitems(sc->twe_drive) && sc->twe_drive[cmd->generic.unit].td_disk) device_printf(sc->twe_drive[cmd->generic.unit].td_disk,
 			  "drive timeout\n");
 	    break;
 	case 0x51:
-	    device_printf(sc->twe_drive[cmd->generic.unit].td_disk,
+	    if (cmd->generic.unit < nitems(sc->twe_drive) && sc->twe_drive[cmd->generic.unit].td_disk) device_printf(sc->twe_drive[cmd->generic.unit].td_disk,
 			  "unrecoverable drive error\n");
 	    break;
 	default:
-	    device_printf(sc->twe_drive[cmd->generic.unit].td_disk,
+	    if (cmd->generic.unit < nitems(sc->twe_drive) && sc->twe_drive[cmd->generic.unit].td_disk) device_printf(sc->twe_drive[cmd->generic.unit].td_disk,
 			  "controller error - %s (flags = 0x%x)\n",
 			  twe_describe_code(twe_table_status, cmd->generic.status),
 			  cmd->generic.flags);
@@ -1877,7 +1882,7 @@
 	/*
 	 * Warning level status.
 	 */
-	device_printf(sc->twe_drive[cmd->generic.unit].td_disk,
+	if (cmd->generic.unit < nitems(sc->twe_drive) && sc->twe_drive[cmd->generic.unit].td_disk) device_printf(sc->twe_drive[cmd->generic.unit].td_disk,
 		      "warning - %s (flags = 0x%x)\n",
 		      twe_describe_code(twe_table_status, cmd->generic.status),
 		      cmd->generic.flags);
@@ -1885,7 +1890,7 @@
 	/*
 	 * Info level status.
 	 */
-	device_printf(sc->twe_drive[cmd->generic.unit].td_disk,
+	if (cmd->generic.unit < nitems(sc->twe_drive) && sc->twe_drive[cmd->generic.unit].td_disk) device_printf(sc->twe_drive[cmd->generic.unit].td_disk,
 		      "attention - %s (flags = 0x%x)\n",
 		      twe_describe_code(twe_table_status, cmd->generic.status),
 		      cmd->generic.flags);