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