Skip to contentSkip to conversation

remoteproc: scp: fix device reference leak on failed lookup

PATCH Applied Johan Hovold 2 participants 2 messages Jul 6 – Jul 8

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 remoteproc: scp: fix device reference leak on failed lookup

Make sure to drop the reference taken to the SCP device when attempting to look up its driver data before the driver has been bound.

Note that holding a reference to a device does not prevent its driver data from going away.

Fixes 63c13d61eafe ("remoteproc/mediatek: add SCP support for mt8183")
Cc Erin Lo <[email protected]>
---
 drivers/remoteproc/mtk_scp.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/remoteproc/mtk_scp.c +8 -1
index 85a74c9ec521..436656bdfa8b 100644
@@ -36,6 +36,7 @@ struct mtk_scp *scp_get(struct platform_device *pdev)
 	struct device *dev = &pdev->dev;
 	struct device_node *scp_node;
 	struct platform_device *scp_pdev;
+	struct mtk_scp *scp;
 
 	scp_node = of_parse_phandle(dev->of_node, "mediatek,scp", 0);
 	if (!scp_node) {
@@ -51,7 +52,13 @@ struct mtk_scp *scp_get(struct platform_device *pdev)
 		return NULL;
 	}
 
-	return platform_get_drvdata(scp_pdev);
+	scp = platform_get_drvdata(scp_pdev);
+	if (!scp) {
+		put_device(&scp_pdev->dev);
+		return NULL;
+	}
+
+	return scp;
 }
 EXPORT_SYMBOL_GPL(scp_get);
 
Signature · 1 line
2.54.0
maintainer Applied
#1 lore raw
Quoted 6 lines · Johan Hovold

Make sure to drop the reference taken to the SCP device when attempting to look up its driver data before the driver has been bound.

Note that holding a reference to a device does not prevent its driver data from going away.

Quoted 8 lines
Fixes 63c13d61eafe ("remoteproc/mediatek: add SCP support for mt8183")
Cc Erin Lo <[email protected]>
---
 drivers/remoteproc/mtk_scp.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

Applied.

Thanks,
Mathieu

Quoted 30 lines
drivers/remoteproc/mtk_scp.c +8 -1
index 85a74c9ec521..436656bdfa8b 100644
@@ -36,6 +36,7 @@ struct mtk_scp *scp_get(struct platform_device *pdev)
 	struct device *dev = &pdev->dev;
 	struct device_node *scp_node;
 	struct platform_device *scp_pdev;
+	struct mtk_scp *scp;
 
 	scp_node = of_parse_phandle(dev->of_node, "mediatek,scp", 0);
 	if (!scp_node) {
@@ -51,7 +52,13 @@ struct mtk_scp *scp_get(struct platform_device *pdev)
 		return NULL;
 	}
 
-	return platform_get_drvdata(scp_pdev);
+	scp = platform_get_drvdata(scp_pdev);
+	if (!scp) {
+		put_device(&scp_pdev->dev);
+		return NULL;
+	}
+
+	return scp;
 }
 EXPORT_SYMBOL_GPL(scp_get);
 
Signature · 1 line
2.54.0