⬢ DragonFlyBSD Kernel Audit
DF-4206 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/i915/vlv_dsi.c
+++ b/sys/dev/drm/i915/vlv_dsi.c
@@ -1857,7 +1857,14 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv)
 	mutex_unlock(&dev->mode_config.mutex);
 
 	if (!fixed_mode) {
 		DRM_DEBUG_KMS("no fixed mode\n");
-		goto err;
+		goto err_connector;
 	}
@@ -1871,7 +1878,11 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv)
 
 	return;
 
+err_connector:
+	/* drm_connector_init() already registered this connector in the
+	 * mode-object IDR and on dev->mode_config.connector_list; undo it
+	 * before the kfree below or every later list/IDR walker uses freed
+	 * memory (DF-4206). */
+	drm_connector_cleanup(connector);
 err:
 	drm_encoder_cleanup(&intel_encoder->base);
 	kfree(intel_dsi);