summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/bridge/panel.c
diff options
context:
space:
mode:
authorMaxime Ripard <maxime@cerno.tech>2023-01-02 13:01:23 +0100
committerMaxime Ripard <maxime@cerno.tech>2023-01-05 08:50:05 +0100
commit8dd4e8c49efc5a7a3879e117e4aa58082734506e (patch)
tree16681bf12e0b8e91f5dd9ee3ddaf84c14b3f82f1 /drivers/gpu/drm/bridge/panel.c
parent51342cc021400841b461cc579f76db24cdb482fc (diff)
drm/bridge: panel: Prevent ERR_PTR Dereference
Commit 5ea6b1702781 ("drm/panel: Add prepare_prev_first flag to drm_panel") introduced an access to the bridge pointer in the devm_drm_panel_bridge_add_typed() function. However, due to the unusual ERR_PTR check when getting that pointer, the pointer access is done even though the pointer might be an error pointer. Rework the function for a more traditional design that will return immediately if it gets an ERR_PTR so that we never access the pointer in that case. Fixes: 5ea6b1702781 ("drm/panel: Add prepare_prev_first flag to drm_panel") Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <error27@gmail.com> Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com> Signed-off-by: Maxime Ripard <maxime@cerno.tech> Link: https://patchwork.freedesktop.org/patch/msgid/20230102120123.19062-1-maxime@cerno.tech Link: https://patchwork.freedesktop.org/patch/msgid/20230102120123.19062-1-maxime@cerno.tech
Diffstat (limited to 'drivers/gpu/drm/bridge/panel.c')
-rw-r--r--drivers/gpu/drm/bridge/panel.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
index 1708098fba6d..e8aae3cdc73d 100644
--- a/drivers/gpu/drm/bridge/panel.c
+++ b/drivers/gpu/drm/bridge/panel.c
@@ -357,15 +357,16 @@ struct drm_bridge *devm_drm_panel_bridge_add_typed(struct device *dev,
return ERR_PTR(-ENOMEM);
bridge = drm_panel_bridge_add_typed(panel, connector_type);
- if (!IS_ERR(bridge)) {
- *ptr = bridge;
- devres_add(dev, ptr);
- } else {
+ if (IS_ERR(bridge)) {
devres_free(ptr);
+ return bridge;
}
bridge->pre_enable_prev_first = panel->prepare_prev_first;
+ *ptr = bridge;
+ devres_add(dev, ptr);
+
return bridge;
}
EXPORT_SYMBOL(devm_drm_panel_bridge_add_typed);