Set valid bridge_connector->bridge_hdmi_cec pointer before calling
possibly calling drmm_connector_hdmi_cec_register(), because
drmm_connector_hdmi_cec_register() directory calls
drm_bridge_connector_hdmi_cec_funcs .init callback,
which does access and use bridge_connector->bridge_hdmi_cec
and expects a valid pointer there.
Without this fix, on Renesas R-Car E3 R8A77990 , the system
crashes on NULL pointer dereference.
Fixes: 2be300f9a0b6 ("drm/display: bridge_connector: get/put the stored
bridges")
Signed-off-by: Marek Vasut <[email protected]>
---
Cc: Andrzej Hajda <[email protected]>
Cc: David Airlie <[email protected]>
Cc: Jernej Skrabec <[email protected]>
Cc: Jonas Karlman <[email protected]>
Cc: Laurent Pinchart <[email protected]>
Cc: Luca Ceresoli <[email protected]>
Cc: Maarten Lankhorst <[email protected]>
Cc: Maxime Ripard <[email protected]>
Cc: Neil Armstrong <[email protected]>
Cc: Robert Foss <[email protected]>
Cc: Simona Vetter <[email protected]>
Cc: Thomas Zimmermann <[email protected]>
Cc: [email protected]
Cc: [email protected]
---
drivers/gpu/drm/display/drm_bridge_connector.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c
b/drivers/gpu/drm/display/drm_bridge_connector.c
index 7b18be3ff9a3..6b9d9694d959 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -855,14 +855,16 @@ struct drm_connector *drm_bridge_connector_init(struct
drm_device *drm,
ret = drmm_connector_hdmi_cec_notifier_register(connector,
NULL,
bridge->hdmi_cec_dev);
if (ret)
return ERR_PTR(ret);
}
+ bridge_connector->bridge_hdmi_cec = drm_bridge_get(bridge_hdmi_cec);
+
if (bridge_hdmi_cec &&
bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_ADAPTER) {
struct drm_bridge *bridge = bridge_hdmi_cec;
ret = drmm_connector_hdmi_cec_register(connector,
&drm_bridge_connector_hdmi_cec_funcs,
bridge->hdmi_cec_adapter_name,
@@ -890,12 +892,11 @@ struct drm_connector *drm_bridge_connector_init(struct
drm_device *drm,
bridge_connector->bridge_edid = drm_bridge_get(bridge_edid);
bridge_connector->bridge_hpd = drm_bridge_get(bridge_hpd);
bridge_connector->bridge_detect = drm_bridge_get(bridge_detect);
bridge_connector->bridge_modes = drm_bridge_get(bridge_modes);
bridge_connector->bridge_hdmi = drm_bridge_get(bridge_hdmi);
bridge_connector->bridge_hdmi_audio = drm_bridge_get(bridge_hdmi_audio);
bridge_connector->bridge_dp_audio = drm_bridge_get(bridge_dp_audio);
- bridge_connector->bridge_hdmi_cec = drm_bridge_get(bridge_hdmi_cec);
return connector;
}
EXPORT_SYMBOL_GPL(drm_bridge_connector_init);
--
2.51.0