summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2020-08-11 22:59:36 +0200
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>2020-09-10 14:26:43 +0200
commitcdd4f7824994c9254acc6e415750529ea2d2cfe0 (patch)
treea7b223f1e66e39bdbedcb1a4ca3422adc9f1c6fb
parent6c11631480e9a0554ae5ee89dc12acaa1f1a93a0 (diff)
downloadlinux-stable-cdd4f7824994c9254acc6e415750529ea2d2cfe0.tar.gz
linux-stable-cdd4f7824994c9254acc6e415750529ea2d2cfe0.tar.bz2
linux-stable-cdd4f7824994c9254acc6e415750529ea2d2cfe0.zip
media: rcar_drif: Fix fwnode reference leak when parsing DT
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>
-rw-r--r--drivers/media/platform/rcar_drif.c16
1 files changed, 5 insertions, 11 deletions
diff --git a/drivers/media/platform/rcar_drif.c b/drivers/media/platform/rcar_drif.c
index 3d2451ac347d..3f1e5cb8b197 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 */