DragonFlyBSD Kernel Audit
DF-1298 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/drm/amd/display/dc/bios/bios_parser.c b/sys/dev/drm/amd/display/dc/bios/bios_parser.c
--- a/sys/dev/drm/amd/display/dc/bios/bios_parser.c
+++ b/sys/dev/drm/amd/display/dc/bios/bios_parser.c
@@ -2652,6 +2652,10 @@
 
 	/* get info for each connector in the slot */
 	slot_layout_info->num_of_connectors = record->ucConnNum;
+	/* ucConnNum is an attacker-influenced VBIOS byte; clamp to the
+	 * fixed connectors[] array or this loop overflows slot_layout_info. */
+	if (slot_layout_info->num_of_connectors > MAX_CONNECTOR_NUMBER_PER_SLOT)
+		slot_layout_info->num_of_connectors = MAX_CONNECTOR_NUMBER_PER_SLOT;
 	for (j = 0; j < slot_layout_info->num_of_connectors; ++j) {
 		slot_layout_info->connectors[j].connector_type =
 			(enum connector_layout_type)