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

Kieran Bingham kieran.bingham at ideasonboard.com
Thu May 14 11:15:01 CEST 2020


Hi Naush,

On 14/05/2020 09:40, 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.
> 

Ouch.

And agreed,

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>


> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> ---
>  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
--
Kieran


More information about the libcamera-devel mailing list