[libcamera-devel] [PATCH] libcamera: camera: Fail to configure on mis-configured streams
Kieran Bingham
kieran.bingham at ideasonboard.com
Fri Jul 19 09:33:46 CEST 2019
Hi Laurent,
On 18/07/2019 14:56, Laurent Pinchart wrote:
> Hi Kieran,
>
> Thank you for the patch.
>
> On Thu, Jul 18, 2019 at 05:27:54AM +0100, Kieran Bingham wrote:
>> Uses of LOG(x, Fatal) and ASSERT() should be capable of continuing
>> without crashing.
>>
>> Camera::configure() validates that each StreamConfiguration has a
>> Stream* and reports a Fatal error otherwise. The code then goes on to
>> dereference the Stream pointer which will be a nullptr in the event of
>> the Fatal error being triggered.
>>
>> In release builds, ASSERTS are compiled out, and LOG(x, Fatal) should
>> attempt to continue or report the error up the call-stack.
>>
>> Make Camera::configure() return an error in the event that the Stream*
>> is not valid. This will cause the configure operation to fail and the
>> application will be notified just as other errors in the
>> Camera::configure() operation do.
>>
>> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>> ---
>> src/libcamera/camera.cpp | 4 +++-
>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
>> index 76c737cb9381..7ad9e0e48686 100644
>> --- a/src/libcamera/camera.cpp
>> +++ b/src/libcamera/camera.cpp
>> @@ -672,9 +672,11 @@ int Camera::configure(CameraConfiguration *config)
>> activeStreams_.clear();
>> for (const StreamConfiguration &cfg : *config) {
>> Stream *stream = cfg.stream();
>> - if (!stream)
>> + if (!stream) {
>> LOG(Camera, Fatal)
>> << "Pipeline handler failed to update stream configuration";
>> + return -EINVAL;
>
> Overall this makes sense, but I wonder if -EINVAL is the appropriate
> error code. The issue at hand is that the pipeline handler is buggy. A
> specific error code to denote errors that are not supposed to happen
> ever would be best I think (and bonus points if we could use that error
> code consistently through libcamera).
-EPIPE 'sounds' appropriate, because we have a broken pipe if we don't
have a stream pointer - as long as that doesn't get too confusing
against other types of pipe :)
Or we could use: "ESTRPIPE 86 Streams pipe error"?
But then again for a generic 'Fatal' error code we could choose one of:
EOWNERDEAD 130 Owner died
ENOTRECOVERABLE 131 State not recoverable
I quite like both of those for a 'fatal' error.
>> + }
>>
>> stream->configuration_ = cfg;
>> activeStreams_.insert(stream);
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list