android: camera_device: Reset config_ if Camera::configure() fails

The config_ pointer is reset in all error paths of the
CameraDevice::configureStreams() function, except when
Camera::configure() fails. Fix it by using a local unique pointer to
store the configuration until the end of the function, to avoid similar
issues in the future.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
This commit is contained in:
Laurent Pinchart 2021-06-15 03:11:30 +03:00
parent c11cc6f20b
commit 7532caa2c7

View file

@ -581,8 +581,8 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
* Generate an empty configuration, and construct a StreamConfiguration * Generate an empty configuration, and construct a StreamConfiguration
* for each camera3_stream to add to it. * for each camera3_stream to add to it.
*/ */
config_ = camera_->generateConfiguration(); std::unique_ptr<CameraConfiguration> config = camera_->generateConfiguration();
if (!config_) { if (!config) {
LOG(HAL, Error) << "Failed to generate camera configuration"; LOG(HAL, Error) << "Failed to generate camera configuration";
return -EINVAL; return -EINVAL;
} }
@ -720,29 +720,27 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
sortCamera3StreamConfigs(streamConfigs, jpegStream); sortCamera3StreamConfigs(streamConfigs, jpegStream);
for (const auto &streamConfig : streamConfigs) { for (const auto &streamConfig : streamConfigs) {
config_->addConfiguration(streamConfig.config); config->addConfiguration(streamConfig.config);
for (auto &stream : streamConfig.streams) { for (auto &stream : streamConfig.streams) {
streams_.emplace_back(this, stream.type, stream.stream, streams_.emplace_back(this, stream.type, stream.stream,
config_->size() - 1); config->size() - 1);
stream.stream->priv = static_cast<void *>(&streams_.back()); stream.stream->priv = static_cast<void *>(&streams_.back());
} }
} }
switch (config_->validate()) { switch (config->validate()) {
case CameraConfiguration::Valid: case CameraConfiguration::Valid:
break; break;
case CameraConfiguration::Adjusted: case CameraConfiguration::Adjusted:
LOG(HAL, Info) << "Camera configuration adjusted"; LOG(HAL, Info) << "Camera configuration adjusted";
for (const StreamConfiguration &cfg : *config_) for (const StreamConfiguration &cfg : *config)
LOG(HAL, Info) << " - " << cfg.toString(); LOG(HAL, Info) << " - " << cfg.toString();
config_.reset();
return -EINVAL; return -EINVAL;
case CameraConfiguration::Invalid: case CameraConfiguration::Invalid:
LOG(HAL, Info) << "Camera configuration invalid"; LOG(HAL, Info) << "Camera configuration invalid";
config_.reset();
return -EINVAL; return -EINVAL;
} }
@ -750,7 +748,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
* Once the CameraConfiguration has been adjusted/validated * Once the CameraConfiguration has been adjusted/validated
* it can be applied to the camera. * it can be applied to the camera.
*/ */
int ret = camera_->configure(config_.get()); int ret = camera_->configure(config.get());
if (ret) { if (ret) {
LOG(HAL, Error) << "Failed to configure camera '" LOG(HAL, Error) << "Failed to configure camera '"
<< camera_->id() << "'"; << camera_->id() << "'";
@ -770,6 +768,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
} }
} }
config_ = std::move(config);
return 0; return 0;
} }