Re: [PATCH] rpmsg: qcom_smd: Fix an OF node leak inqcom_smd_register_edge()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thank you for your review.

On 1/7/25 21:40, Dmitry Baryshkov wrote:
On Tue, Jan 07, 2025 at 05:18:23PM +0900, Joe Hattori wrote:
qcom_smd_register_edge() leaks an OF node reference when
qcom_smd_create_chrdev() fails, since qcom_smd_parse_edge() sets
of_node_get(node) to edge->of_node. Add of_node_put() calls to the error
path of qcom_smd_register_edge() and qcom_smd_unregister_edge().

This was found by an experimental verifier that I am developing. Due to
the lack of actual devices, no runtime test was able to be performed.

Fixes: 53e2822e56c7 ("rpmsg: Introduce Qualcomm SMD backend")
Signed-off-by: Joe Hattori <joe@xxxxxxxxxxxxxxxxxxxxx>
---
  drivers/rpmsg/qcom_smd.c | 5 ++++-
  1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c
index 40d386809d6b..6982015b218d 100644
--- a/drivers/rpmsg/qcom_smd.c
+++ b/drivers/rpmsg/qcom_smd.c
@@ -1509,13 +1509,15 @@ struct qcom_smd_edge *qcom_smd_register_edge(struct device *parent,
  	ret = qcom_smd_create_chrdev(edge);
  	if (ret) {
  		dev_err(&edge->dev, "failed to register chrdev for edge\n");
-		goto unregister_dev;
+		goto put_node;
  	}
schedule_work(&edge->scan_work); return edge; +put_node:
+	of_node_put(node);

please put edge->of_node to make it more obvious what is happening.

Yes, addressed in the v2 patch.

  unregister_dev:
  	if (!IS_ERR_OR_NULL(edge->mbox_chan))
  		mbox_free_channel(edge->mbox_chan);
@@ -1548,6 +1550,7 @@ void qcom_smd_unregister_edge(struct qcom_smd_edge *edge)
  	if (ret)
  		dev_warn(&edge->dev, "can't remove smd device: %d\n", ret);
+ of_node_put(edge->of_node);
  	mbox_free_channel(edge->mbox_chan);
  	device_unregister(&edge->dev);
  }
--
2.34.1



Best,
Joe




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux