Message ID | 20200811205939.19550-3-laurent.pinchart+renesas@ideasonboard.com |
---|---|
State | Accepted |
Commit | cdd4f7824994c9254acc6e415750529ea2d2cfe0 |
Headers | show |
Series | None | expand |
Hi Laurent, On 11/08/2020 21:59, Laurent Pinchart wrote: > 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> Simplified indeed. Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> > --- > 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 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 */ >
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 */
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> --- drivers/media/platform/rcar_drif.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-)