]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/bridge: dw-mipi-dsi: Fix bridge leak when host attach fails
authorOsama Abdelkader <osama.abdelkader@gmail.com>
Fri, 3 Apr 2026 14:52:05 +0000 (16:52 +0200)
committerLuca Ceresoli <luca.ceresoli@bootlin.com>
Tue, 14 Apr 2026 10:29:03 +0000 (12:29 +0200)
dw_mipi_dsi_host_attach() and dw_mipi_dsi2_host_attach() call
drm_bridge_add() before pdata->host_ops->attach(). If attach fails,
the bridge stayed registered without drm_bridge_remove(), leaking the
bridge reference and leaving the device on the global bridge list.

Fixes: 90910a651123 ("drm/bridge/synopsys: dsi: add ability to have glue-specific attach and detach")
Fixes: 0d6d86253fef ("drm/bridge/synopsys: Add MIPI DSI2 host controller bridge")
Signed-off-by: Osama Abdelkader <osama.abdelkader@gmail.com>
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Link: https://patch.msgid.link/20260403145208.15890-1-osama.abdelkader@gmail.com
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi2.c

index ca4dea226f4b5f7b6a3e869baa7bd9281e507e9d..ef7be20a59cde2600fab200245dd4cc673334bdb 100644 (file)
@@ -345,10 +345,14 @@ static int dw_mipi_dsi_host_attach(struct mipi_dsi_host *host,
        if (pdata->host_ops && pdata->host_ops->attach) {
                ret = pdata->host_ops->attach(pdata->priv_data, device);
                if (ret < 0)
-                       return ret;
+                       goto err_remove_bridge;
        }
 
        return 0;
+
+err_remove_bridge:
+       drm_bridge_remove(&dsi->bridge);
+       return ret;
 }
 
 static int dw_mipi_dsi_host_detach(struct mipi_dsi_host *host,
index e6eaf9fd02516b0ee67680da28f789044cdae8f6..a4bfd3ad166d1b833b8a8514e208d47d44918fec 100644 (file)
@@ -540,10 +540,14 @@ static int dw_mipi_dsi2_host_attach(struct mipi_dsi_host *host,
        if (pdata->host_ops && pdata->host_ops->attach) {
                ret = pdata->host_ops->attach(pdata->priv_data, device);
                if (ret < 0)
-                       return ret;
+                       goto err_remove_bridge;
        }
 
        return 0;
+
+err_remove_bridge:
+       drm_bridge_remove(&dsi2->bridge);
+       return ret;
 }
 
 static int dw_mipi_dsi2_host_detach(struct mipi_dsi_host *host,