⬢ DragonFlyBSD Kernel Audit
DF-3628 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/i915/intel_dp.c
+++ b/sys/dev/drm/i915/intel_dp.c
@@ -859,8 +859,15 @@ bxt_power_sequencer_idx(struct intel_dp *intel_dp)
 	lockdep_assert_held(&dev_priv->pps_mutex);
 
 	/* We should never land here with regular DP ports */
 	WARN_ON(!intel_dp_is_edp(intel_dp));
 
+	/*
+	 * The VBT-supplied controller number is a raw byte from firmware
+	 * (valid hardware values are 0 and 1). Clamp it so a corrupt or
+	 * malicious VBT cannot redirect PPS register accesses outside the
+	 * two-entry power sequencer block.
+	 */
+	backlight_controller = min(backlight_controller, 1);
+
 	if (!intel_dp->pps_reset)
 		return backlight_controller;
 
 	intel_dp->pps_reset = false;