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

Reply via email to