⬢ DragonFlyBSD Kernel Audit
DF-4557 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/disk/nata/atapi-cam.c	2026-09-21 13:15:11.155028752 +0000
+++ b/sys/dev/disk/nata/atapi-cam.c	2026-09-21 13:16:00.246393469 +0000
@@ -358,6 +358,13 @@
 	struct ccb_pathinq *cpi = &ccb->cpi;
 	int tid = ccb_h->target_id;
 
+	if (tid != CAM_TARGET_WILDCARD &&
+	    tid >= (int)NELEM(softc->atadev)) {
+	    ccb->ccb_h.status = CAM_DEV_NOT_THERE;
+	    xpt_done(ccb);
+	    return;
+	}
+
 	cpi->version_num = 1;
 	cpi->hba_inquiry = 0;
 	cpi->target_sprt = 0;
@@ -428,6 +435,11 @@
     case XPT_RESET_DEV: {
 	int tid = ccb_h->target_id;
 
+	if (tid < 0 || tid >= (int)NELEM(softc->atadev)) {
+	    ccb->ccb_h.status = CAM_DEV_NOT_THERE;
+	    xpt_done(ccb);
+	    return;
+	}
 	CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_SUBTRACE, ("dev reset\n"));
 	ata_controlcmd(softc->atadev[tid]->dev, ATA_DEVICE_RESET, 0, 0, 0);
 	ccb->ccb_h.status = CAM_REQ_CMP;
@@ -477,6 +489,14 @@
 	int tid = ccb_h->target_id, lid = ccb_h->target_lun;
 	int request_flags = ATA_R_QUIET | ATA_R_ATAPI;
 
+	/* ccb_h->target_id is not bounded by this SIM's max_target:
+	 * reject out-of-range ids before indexing atadev[]. */
+	if (tid < 0 || tid >= (int)NELEM(softc->atadev)) {
+	    ccb->ccb_h.status = CAM_DEV_NOT_THERE;
+	    xpt_done(ccb);
+	    return;
+	}
+
 	CAM_DEBUG(ccb_h->path, CAM_DEBUG_SUBTRACE, ("XPT_SCSI_IO\n"));
 
 	lockmgr(&softc->state_lock, LK_EXCLUSIVE);