[libcamera-devel] [PATCH v2] libcamera: v4l2_device: openat(2) with O_CLOEXEC to cleanup after exec(3)

Elias Naur mail at eliasnaur.com
Sun Mar 12 22:22:05 CET 2023


It's generally a good idea to openat(2) with O_CLOEXEC, but this patch
also fixes a real (corner-)case: I have an excutable that (1) uses
v4l2-compat to drive a RPi camera, (2) self-updates through exec(3).
Without O_CLOEXEC of the kernel devices, an update while the
camera is opened will result in -EBUSY errors when the update tries to
open the camera.

Signed-off-by: Elias Naur <mail at eliasnaur.com>
---

This update fixes a style issue raised through review and clarifies the
 motivatition for the fix.

 src/libcamera/v4l2_device.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git src/libcamera/v4l2_device.cpp src/libcamera/v4l2_device.cpp
index 57a88d96..9eb26839 100644
--- src/libcamera/v4l2_device.cpp
+++ src/libcamera/v4l2_device.cpp
@@ -86,7 +86,7 @@ int V4L2Device::open(unsigned int flags)
 		return -EBUSY;
 	}
 
-	UniqueFD fd(syscall(SYS_openat, AT_FDCWD, deviceNode_.c_str(), flags));
+	UniqueFD fd(syscall(SYS_openat, AT_FDCWD, deviceNode_.c_str(), flags | O_CLOEXEC));
 	if (!fd.isValid()) {
 		int ret = -errno;
 		LOG(V4L2, Error) << "Failed to open V4L2 device '"
-- 
2.39.2



More information about the libcamera-devel mailing list