libcamera: v4l2_videodevice: Guard against releasing unallocated buffers

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@raspberrypi.com>
Tested-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Naushir Patuck 2022-10-28 14:38:47 +01:00 committed by Kieran Bingham
parent 02518e598e
commit a2bdff6d0b

View file

@ -1533,6 +1533,9 @@ int V4L2VideoDevice::importBuffers(unsigned int count)
*/ */
int V4L2VideoDevice::releaseBuffers() int V4L2VideoDevice::releaseBuffers()
{ {
if (!cache_)
return 0;
LOG(V4L2, Debug) << "Releasing buffers"; LOG(V4L2, Debug) << "Releasing buffers";
delete cache_; delete cache_;