⬢ DragonFlyBSD Kernel Audit
DF-4853 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/evergreen_hdmi.c	2026-09-24 14:13:17.526117523 +0000
+++ b/sys/dev/drm/radeon/evergreen_hdmi.c	2026-09-24 14:13:26.693998927 +0000
@@ -428,6 +428,21 @@
 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
 	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
 
+	/*
+	 * enc_priv is only a radeon_encoder_atom_dig for encoders NOT
+	 * registered as DRM_MODE_ENCODER_LVDS.  LCD-carrying digital
+	 * encoders (every eDP panel: UNIPHY* + ATOM_DEVICE_LCD_SUPPORT,
+	 * atombios_encoders.c:2862-2869, and TMDS1/LVTM1 with LCD support
+	 * at :2824-2836) carry a 280-byte radeon_encoder_lvds instead, and
+	 * dig->afmt (+288) reads 8 bytes past the object into the adjacent
+	 * slab chunk (DF-4853, DF-4635/DF-4828 family).  eDP connectors
+	 * pass the encoder_mode==HDMI||IS_DP gate at
+	 * atombios_encoders.c:1848-1851, so this dpms path IS reachable
+	 * with the mis-typed enc_priv.
+	 */
+	if (!dig || encoder->encoder_type == DRM_MODE_ENCODER_LVDS)
+		return;
+
 	if (!dig || !dig->afmt)
 		return;
 
@@ -470,6 +485,10 @@
 	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
 	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
 
+	/* see evergreen_hdmi_enable(): enc_priv type gate (DF-4853) */
+	if (!dig || encoder->encoder_type == DRM_MODE_ENCODER_LVDS)
+		return;
+
 	if (!dig || !dig->afmt)
 		return;