media: rcar_drif: Fix fwnode reference leak when parsing DT
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Tue, 11 Aug 2020 20:59:36 +0000 (22:59 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 10 Sep 2020 12:26:43 +0000 (14:26 +0200)
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+renesas@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/rcar_drif.c

index 3d2451a..3f1e5cb 100644 (file)
@@ -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 */