From 353fc4c223225f32176f9fc35a832d633486aa0d Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Thu, 14 May 2020 09:40:03 +0100 Subject: libcamera: v4l2_videodevice: Fix dangling file descriptor 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 Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart Signed-off-by: Laurent Pinchart --- src/libcamera/v4l2_videodevice.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src/libcamera/v4l2_videodevice.cpp') diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp index d35596bd..fbe55bc6 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; } /** -- cgit v1.2.1