From 835c1bf35ecf402b5fb13a8cd2ac56e9f22dc585 Mon Sep 17 00:00:00 2001 From: Han-Lin Chen Date: Thu, 12 Sep 2024 05:09:39 +0000 Subject: [PATCH] libcamera: Put buffer back to V4L2BufferCache when VIDIOC_QBUF fails The patch puts buffer back to V4L2BufferCache when VIDIOC_QBUF fails in V4L2VideoDevice. This is to avoid cache leaks and causing assert. Fixes: cadae67e4578 ("libcamera: v4l2_videodevice: Add FrameBuffer interface") Signed-off-by: Han-Lin Chen Co-developed-by: Harvey Yang Signed-off-by: Harvey Yang Reviewed-by: Kieran Bingham Signed-off-by: Kieran Bingham --- src/libcamera/v4l2_videodevice.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp index 7822bf1e..76bdad40 100644 --- a/src/libcamera/v4l2_videodevice.cpp +++ b/src/libcamera/v4l2_videodevice.cpp @@ -1682,11 +1682,15 @@ int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer) */ if (planes.size() < numV4l2Planes) { LOG(V4L2, Error) << "Frame buffer has too few planes"; + cache_->put(buf.index); + return -EINVAL; } if (planes.size() != numV4l2Planes && !buffer->_d()->isContiguous()) { LOG(V4L2, Error) << "Device format requires contiguous buffer"; + cache_->put(buf.index); + return -EINVAL; } @@ -1729,6 +1733,8 @@ int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer) if (i != planes.size() - 1 && bytesused != length) { LOG(V4L2, Error) << "Holes in multi-planar buffer not supported"; + cache_->put(buf.index); + return -EINVAL; } } @@ -1778,6 +1784,8 @@ int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer) LOG(V4L2, Error) << "Failed to queue buffer " << buf.index << ": " << strerror(-ret); + cache_->put(buf.index); + return ret; }