DragonFlyBSD Kernel Audit
DF-1347 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/disk/amd/amd.c b/sys/dev/disk/amd/amd.c
--- a/sys/dev/disk/amd/amd.c
+++ b/sys/dev/disk/amd/amd.c
@@ -1828,6 +1828,12 @@
 	/* get ID */
 	amd->cur_target = amd_read8(amd, SCSIFIFOREG);
 	amd->cur_target ^= amd->HostID_Bit;
+	if (amd->cur_target == 0 || (amd->cur_target & (amd->cur_target - 1)) != 0) {
+		device_printf(amd->dev, "invalid reselect id 0x%x\n", amd->cur_target);
+		amd->cur_target = 0;
+		amd_write8(amd, SCSICMDREG, RST_SCSI_BUS_CMD);
+		return;
+	}
 	amd->cur_target = ffs(amd->cur_target) - 1;
 	amd->cur_lun = amd_read8(amd, SCSIFIFOREG) & 7;
 	tinfo = &amd->tinfo[amd->cur_target];