[libcamera-devel] [PATCH v2] libcamera: v4l2_videodevice: Fix dangling file descriptor

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon May 18 13:40:57 CEST 2020


Hi Naush,

Thank you for the patch.

On Thu, May 14, 2020 at 09:40:03AM +0100, Naushir Patuck wrote:
> The FileDescriptor constructor used in V4L2VideoDevice::exportDmabufFd()
> creates a duplicate of the fd to store in the object. The original
> fd returned by the VIDIOC_EXPBUF ioctl was never closed, and left
> dangling. This would cause out of memory conditions if the camera stream
> was repeatedly started and stopped.
> 
> This change closes the original fd explicitly, fixing the leak.
> 
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

and applied.

This issue however shows that the FileDescriptor class API is not ideal.
I'll propose enhancements and CC you.

> ---
>  src/libcamera/v4l2_videodevice.cpp | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> index 4b9f8b5c..2f9c1333 100644
> --- a/src/libcamera/v4l2_videodevice.cpp
> +++ b/src/libcamera/v4l2_videodevice.cpp
> @@ -1276,7 +1276,14 @@ FileDescriptor V4L2VideoDevice::exportDmabufFd(unsigned int index,
>  		return FileDescriptor();
>  	}
>  
> -	return FileDescriptor(expbuf.fd);
> +	FileDescriptor fd(expbuf.fd);
> +	/*
> +	 * FileDescriptor takes a duplicate of fd, so we must close the
> +	 * original here, otherwise it will be left dangling.
> +	 */
> +	::close(expbuf.fd);
> +
> +	return fd;
>  }
>  
>  /**

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list