[libcamera-devel] [PATCH] libcamera: v4l2_videodevice: Guard against releasing unallocated buffers

Naushir Patuck naush at raspberrypi.com
Fri Oct 28 15:38:47 CEST 2022


releaseBuffers() unconditionally calls ioctl(REQBUFS, 0) to release device
buffer allocations through the close() and class destructor functions. If
another libcamera process is running concurrently with a different sensor, it
would cause the ioctl to fail in the kernel because the buffer queue is owned
owned by the other process. This in turn would cause libcamera to generate an
error log message.

Fix this by ensuring the releaseBuffers() only calls ioctl(REQBUFS, 0) if there
have been buffers previously allocated by the device. This is done by testing
the presense of the V4L2BufferCache in the object.

Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
---
 src/libcamera/v4l2_videodevice.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index e30858c9fa02..0d60dbd1c23d 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -1533,6 +1533,9 @@ int V4L2VideoDevice::importBuffers(unsigned int count)
  */
 int V4L2VideoDevice::releaseBuffers()
 {
+	if (!cache_)
+		return 0;
+
 	LOG(V4L2, Debug) << "Releasing buffers";
 
 	delete cache_;
-- 
2.25.1



More information about the libcamera-devel mailing list