⬢ DragonFlyBSD Kernel Audit
DF-4205 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/i915/vlv_dsi.c
+++ b/sys/dev/drm/i915/vlv_dsi.c
@@ -1794,6 +1794,10 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv)
 	else
 		intel_encoder->crtc_mask = BIT(PIPE_B);
 
+	/* intel_bios_is_dsi_present() keys off the child device list, but
+	 * vbt.dsi.config is only set when BDB_MIPI_CONFIG exists and both
+	 * kmemdups in parse_mipi_config() succeeded.  Never deref it
+	 * unguarded (DF-4205). */
+	if (!dev_priv->vbt.dsi.config)
+		goto err;
+
 	if (dev_priv->vbt.dsi.config->dual_link)
 		intel_dsi->ports = BIT(PORT_A) | BIT(PORT_C);
 	else
--- a/sys/dev/drm/i915/intel_bios.c
+++ b/sys/dev/drm/i915/intel_bios.c
@@ -846,6 +846,7 @@ parse_mipi_config(struct drm_i915_private *dev_priv,
 	dev_priv->vbt.dsi.pps = kmemdup(pps, sizeof(struct mipi_pps_data), GFP_KERNEL);
 	if (!dev_priv->vbt.dsi.pps) {
 		kfree(dev_priv->vbt.dsi.config);
+		dev_priv->vbt.dsi.config = NULL;
 		return;
 	}