diff mbox series

staging: media: imx: fix OF node leak in imx_media_add_of_subdevs()

Message ID 20241224035411.2220404-1-joe@pf.is.s.u-tokyo.ac.jp (mailing list archive)
State New
Headers show
Series staging: media: imx: fix OF node leak in imx_media_add_of_subdevs() | expand

Commit Message

Joe Hattori Dec. 24, 2024, 3:54 a.m. UTC
imx_media_add_of_subdevs() calls of_parse_phandle() and passes the
obtained node to imx_media_of_add_csi(). The passed node is used in
v4l2_async_nf_add_fwnode(), which increments the refcount of the node.
Therefore, while the current implementation only releases the node when
imx_media_of_add_csi() fails, but should always release it. Call
of_node_put() right after imx_media_of_add_csi().

Fixes: dee747f88167 ("media: imx: Don't register IPU subdevs/links if CSI port missing")
Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
---
 drivers/staging/media/imx/imx-media-of.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

Comments

Vladimir Zapolskiy Dec. 24, 2024, 9:01 a.m. UTC | #1
On 12/24/24 05:54, Joe Hattori wrote:
> imx_media_add_of_subdevs() calls of_parse_phandle() and passes the
> obtained node to imx_media_of_add_csi(). The passed node is used in
> v4l2_async_nf_add_fwnode(), which increments the refcount of the node.
> Therefore, while the current implementation only releases the node when
> imx_media_of_add_csi() fails, but should always release it. Call
> of_node_put() right after imx_media_of_add_csi().
> 
> Fixes: dee747f88167 ("media: imx: Don't register IPU subdevs/links if CSI port missing")
> Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
> ---
>   drivers/staging/media/imx/imx-media-of.c | 8 ++------
>   1 file changed, 2 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/staging/media/imx/imx-media-of.c b/drivers/staging/media/imx/imx-media-of.c
> index 118bff988bc7..bb28daa4d713 100644
> --- a/drivers/staging/media/imx/imx-media-of.c
> +++ b/drivers/staging/media/imx/imx-media-of.c
> @@ -54,22 +54,18 @@ int imx_media_add_of_subdevs(struct imx_media_dev *imxmd,
>   			break;
>   
>   		ret = imx_media_of_add_csi(imxmd, csi_np);
> +		of_node_put(csi_np);
>   		if (ret) {
>   			/* unavailable or already added is not an error */
>   			if (ret == -ENODEV || ret == -EEXIST) {
> -				of_node_put(csi_np);
>   				continue;
>   			}
>   
>   			/* other error, can't continue */
> -			goto err_out;
> +			return ret;
>   		}
>   	}
>   
>   	return 0;
> -
> -err_out:
> -	of_node_put(csi_np);
> -	return ret;
>   }
>   EXPORT_SYMBOL_GPL(imx_media_add_of_subdevs);

Reviewed-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>

--
Best wishes,
Vladimir
diff mbox series

Patch

diff --git a/drivers/staging/media/imx/imx-media-of.c b/drivers/staging/media/imx/imx-media-of.c
index 118bff988bc7..bb28daa4d713 100644
--- a/drivers/staging/media/imx/imx-media-of.c
+++ b/drivers/staging/media/imx/imx-media-of.c
@@ -54,22 +54,18 @@  int imx_media_add_of_subdevs(struct imx_media_dev *imxmd,
 			break;
 
 		ret = imx_media_of_add_csi(imxmd, csi_np);
+		of_node_put(csi_np);
 		if (ret) {
 			/* unavailable or already added is not an error */
 			if (ret == -ENODEV || ret == -EEXIST) {
-				of_node_put(csi_np);
 				continue;
 			}
 
 			/* other error, can't continue */
-			goto err_out;
+			return ret;
 		}
 	}
 
 	return 0;
-
-err_out:
-	of_node_put(csi_np);
-	return ret;
 }
 EXPORT_SYMBOL_GPL(imx_media_add_of_subdevs);