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

Naushir Patuck naush at raspberrypi.com
Thu May 14 10:40:03 CEST 2020


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>
---
 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;
 }
 
 /**
-- 
2.17.1



More information about the libcamera-devel mailing list