From: Laurent Pinchart <laurent.pinchart+rene...@ideasonboard.com>

[ Upstream commit cdd4f7824994c9254acc6e415750529ea2d2cfe0 ]

The fwnode reference corresponding to the endpoint is leaked in an error
path of the rcar_drif_parse_subdevs() function. Fix it, and reorganize
fwnode reference handling in the function to release references early,
simplifying error paths.

Signed-off-by: Laurent Pinchart <laurent.pinchart+rene...@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ai...@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+hua...@kernel.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/media/platform/rcar_drif.c | 16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

diff --git a/drivers/media/platform/rcar_drif.c 
b/drivers/media/platform/rcar_drif.c
index 3d2451ac347d7..3f1e5cb8b1976 100644
--- a/drivers/media/platform/rcar_drif.c
+++ b/drivers/media/platform/rcar_drif.c
@@ -1227,28 +1227,22 @@ static int rcar_drif_parse_subdevs(struct rcar_drif_sdr 
*sdr)
        if (!ep)
                return 0;
 
+       /* Get the endpoint properties */
+       rcar_drif_get_ep_properties(sdr, ep);
+
        fwnode = fwnode_graph_get_remote_port_parent(ep);
+       fwnode_handle_put(ep);
        if (!fwnode) {
                dev_warn(sdr->dev, "bad remote port parent\n");
-               fwnode_handle_put(ep);
                return -EINVAL;
        }
 
        sdr->ep.asd.match.fwnode = fwnode;
        sdr->ep.asd.match_type = V4L2_ASYNC_MATCH_FWNODE;
        ret = v4l2_async_notifier_add_subdev(notifier, &sdr->ep.asd);
-       if (ret) {
-               fwnode_handle_put(fwnode);
-               return ret;
-       }
-
-       /* Get the endpoint properties */
-       rcar_drif_get_ep_properties(sdr, ep);
-
        fwnode_handle_put(fwnode);
-       fwnode_handle_put(ep);
 
-       return 0;
+       return ret;
 }
 
 /* Check if the given device is the primary bond */
-- 
2.25.1

Reply via email to