⬢ DragonFlyBSD Kernel Audit
DF-2260 / fix.diff
← back to finding ↓ download raw
--- a/sys/bus/cam/cam_periph.c	2026-10-21 04:27:46.575051812 +0000
+++ b/sys/bus/cam/cam_periph.c	2026-10-21 04:27:46.575051812 +0000
@@ -4,4 +4,19 @@
 			       "length 0\n");
 			return(EINVAL);
 		}
+		/*
+		 * DF-2260: num_patterns is user-controlled and was never
+		 * bounded by pattern_buf_len; xpt_action(XPT_DEV_MATCH)
+		 * walked patterns[0..num_patterns-1] past the mapped
+		 * buffer (heap OOB read / page-fault panic).
+		 */
+		if (ccb->cdm.pattern_buf_len > 0 &&
+		    ccb->cdm.num_patterns > ccb->cdm.pattern_buf_len /
+		    sizeof(struct dev_match_pattern)) {
+			kprintf("cam_periph_mapmem: num_patterns (%u) "
+				"exceeds pattern_buf_len (%u)\n",
+				ccb->cdm.num_patterns,
+				ccb->cdm.pattern_buf_len);
+			return(EINVAL);
+		}
 		if (ccb->cdm.pattern_buf_len > 0) {
\ No newline at end of file