[libcamera-devel] [PATCH] android: camera_device: Fix crash of accessing a missing map element

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Oct 28 11:35:17 CET 2020


On Wed, Oct 28, 2020 at 10:33:04AM +0000, Kieran Bingham wrote:
> Hi Hiro-san,
> 
> On 28/10/2020 08:57, Hirokazu Honda wrote:
> > std::map::at() searches std::map by the given key. The commit
> > e1f9fdb8a5bd096faa34d54804afa48d46d59b28 uses it with 0 to intend to
> > accessing the first element of the map, but actually access the
> > element whose key is nullptr. This causes the crash because the map
> > doesn't have the element with nullptr. This fixes the issue by
> > replacing the std::map::at() operation by std::map::begin().
> > 
> 
> Ayeee - I'm sorry - It looks like I certainly messed up something there.
> 
> Before pushing, I ran that series through our unit-tests, but of course
> that doesn't cover src/android, and I had obviously neglected to further
> test the android layer. The clue that I should have done so is in the
> prefix of the patches, so I'm sorry that I missed that.
> 
> 
> Even the code it came from was correct:
> 
> -       FrameBuffer *buffer = buffers.begin()->second;
> -       resultMetadata = getResultMetadata(descriptor->frameNumber_,
> -                                          buffer->metadata().timestamp);
> +       uint64_t timestamp = buffers.at(0)->metadata().timestamp;
> +       resultMetadata = getResultMetadata(descriptor->frameNumber_,
> timestamp);
> 
> So your fix is certainly better.
> 
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 
> 
> It makes me wonder if the integration processes needs to be able to
> cover more use-cases, but it's not going to be easy to automate testing
> of the android layer from a normal build currently.
> 
> We'd have to mock up the Android HAL calls ... hrm. .. not impossible,
> but I wonder what the best way to do all that would be (without
> requiring a full CTS).

We could have basic smoketests, but we're missing the infrastructure to
run them automatically on a real (or even virtual) device at the moment.
Clearly something we'll have to address.

> > Signed-off-by: Hirokazu Honda <hiroh at chromium.org>

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

And we really need to move the timestamp from the buffers to the
request.

> > ---
> >  src/android/camera_device.cpp | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> > index ca60f51..ead8a43 100644
> > --- a/src/android/camera_device.cpp
> > +++ b/src/android/camera_device.cpp
> > @@ -1525,7 +1525,7 @@ void CameraDevice::requestComplete(Request *request)
> >  	 * It might be appropriate to return a 'correct' (as determined by
> >  	 * pipeline handlers) timestamp in the Request itself.
> >  	 */
> > -	uint64_t timestamp = buffers.at(0)->metadata().timestamp;
> > +	uint64_t timestamp = buffers.begin()->second->metadata().timestamp;
> >  	resultMetadata = getResultMetadata(descriptor->frameNumber_, timestamp);
> > 
> >  	/* Handle any JPEG compression. */

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list