From 7532caa2c77b966afde643d5550dff6e404e7208 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 15 Jun 2021 03:11:30 +0300 Subject: 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 Reviewed-by: Hirokazu Honda Reviewed-by: Umang Jain --- src/android/camera_device.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 86ea22b6..407db507 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -581,8 +581,8 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) * Generate an empty configuration, and construct a StreamConfiguration * for each camera3_stream to add to it. */ - config_ = camera_->generateConfiguration(); - if (!config_) { + std::unique_ptr config = camera_->generateConfiguration(); + if (!config) { LOG(HAL, Error) << "Failed to generate camera configuration"; return -EINVAL; } @@ -720,29 +720,27 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) sortCamera3StreamConfigs(streamConfigs, jpegStream); for (const auto &streamConfig : streamConfigs) { - config_->addConfiguration(streamConfig.config); + config->addConfiguration(streamConfig.config); for (auto &stream : streamConfig.streams) { streams_.emplace_back(this, stream.type, stream.stream, - config_->size() - 1); + config->size() - 1); stream.stream->priv = static_cast(&streams_.back()); } } - switch (config_->validate()) { + switch (config->validate()) { case CameraConfiguration::Valid: break; case CameraConfiguration::Adjusted: LOG(HAL, Info) << "Camera configuration adjusted"; - for (const StreamConfiguration &cfg : *config_) + for (const StreamConfiguration &cfg : *config) LOG(HAL, Info) << " - " << cfg.toString(); - config_.reset(); return -EINVAL; case CameraConfiguration::Invalid: LOG(HAL, Info) << "Camera configuration invalid"; - config_.reset(); return -EINVAL; } @@ -750,7 +748,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) * Once the CameraConfiguration has been adjusted/validated * it can be applied to the camera. */ - int ret = camera_->configure(config_.get()); + int ret = camera_->configure(config.get()); if (ret) { LOG(HAL, Error) << "Failed to configure camera '" << camera_->id() << "'"; @@ -770,6 +768,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) } } + config_ = std::move(config); return 0; } -- cgit v1.2.1