[libcamera-devel] [PATCH] libcamera: pipeline: simple: Fix crash when storing timestamp in metadata

Jacopo Mondi jacopo at jmondi.org
Thu Jun 17 11:27:31 CEST 2021


Hi Laurent,

On Thu, Jun 17, 2021 at 12:12:28PM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
>
> On Thu, Jun 17, 2021 at 10:10:21AM +0200, Jacopo Mondi wrote:
> > On Thu, Jun 17, 2021 at 02:44:22AM +0300, Laurent Pinchart wrote:
> > > Commit 922833f774f6 ("libcamera: simple: Report sensor timestamp")
> > > unconditionally tries to access the request through the capture buffer
> > > to store the capture timestamp in the metadata. This causes a null
> > > pointer dereference when using a converter, as the capture buffers are
> > > free-wheeling in that case, and not associated with a request.
> > >
> > > Fix this by getting the request from the user-facing buffer, which can
> > > be the capture buffer when no converter is used.
> > >
> > > Fixes: 922833f774f6 ("libcamera: simple: Report sensor timestamp")
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> >
> > My bad, my understanding of the converters in the simple pipeline is
> > limited. Thanks for fixing
>
> No worries. I missed it during review too :-)
>
> > > ---
> > >  src/libcamera/pipeline/simple/simple.cpp | 20 +++++++++++++++++---
> > >  1 file changed, 17 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> > > index 36fd9b852b33..e63d0bfd2fcb 100644
> > > --- a/src/libcamera/pipeline/simple/simple.cpp
> > > +++ b/src/libcamera/pipeline/simple/simple.cpp
> > > @@ -1127,14 +1127,28 @@ void SimplePipelineHandler::bufferReady(FrameBuffer *buffer)
> > >  	}
> > >
> > >  	/*
> > > -	 * Record the sensor's timestamp in the request metadata.
> > > +	 * Record the sensor's timestamp in the request metadata. The request
> > > +	 * needs to be obtained from the user-facing buffer, as internal
> > > +	 * buffers are free-wheeling and have no request associated with them.
> > >  	 *
> > >  	 * \todo The sensor timestamp should be better estimated by connecting
> > >  	 * to the V4L2Device::frameStart signal if the platform provides it.
> > >  	 */
> > >  	Request *request = buffer->request();
> > > -	request->metadata().set(controls::SensorTimestamp,
> > > -				buffer->metadata().timestamp);
> > > +
> > > +	if (data->useConverter_ && !data->converterQueue_.empty()) {
> > > +		const std::map<unsigned int, FrameBuffer *> &outputs =
> > > +			data->converterQueue_.front();
> > > +		if (!outputs.empty()) {
> >
> > Can outputs be empty if !data->converterQueue_.empty() ?
>
> They shouldn't, but as there's the same sanity check in
> converter->queueBuffers(), which is called *after* this code block, I
> thought it would be best to be cautious. Eventually we should probably
> rework this to only queue buffers for capture when there are request
> queued, the same way te IPU3 pipeline handler does it, but that was a
> too big change for a fix.
>
> > > +			FrameBuffer *outputBuffer = outputs.begin()->second;
> > > +			if (outputBuffer)
> > > +				request = outputBuffer->request();
> > > +		}
> > > +	}
> > > +
> > > +	if (request)
> > > +		request->metadata().set(controls::SensorTimestamp,
> > > +					buffer->metadata().timestamp);
> >
> > We could end up without a request
> > Before 922833f774f6 the Request * was simply retreived with
> >
> >         Request *request = buffer->request();
> >
> > If we can now end up without a Request *, how can we complete it here
> > below ?
>
> request can be null here if
>
> 	data->useConverter && data->converterQueue_.empty()
>
> In that case we'll take the `if (data->useConverter_)` branch, and won't
> reach the completeBuffer() call.

Oh right, I missed the condition check

>
> It's a little bit convoluted, the other option was to deplicate the
> request->metadata().set() call, which I didn't like much.

Yes, not easy to follow in full, thanks for the clarifications

Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>

Thanks
  j

>
> > >  	/*
> > >  	 * Queue the captured and the request buffer to the converter if format
>
> --
> Regards,
>
> Laurent Pinchart


More information about the libcamera-devel mailing list