summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortimothywang <timothywang@google.com>2022-02-16 15:27:27 +0800
committertimothywang <timothywang@google.com>2022-02-16 21:26:14 +0800
commit379051d257bf34a0982d44ab28e90666140a278b (patch)
tree3b615f21ec898ec9b3d0bf41fcbe19a98e4f7caf
parent2079123b6cc0a716d46b13342edd0d3829c47f2a (diff)
downloadcamera-379051d257bf34a0982d44ab28e90666140a278b.tar.gz
camera: handle hidl transaction error [DO NOT MERGE]
Handle hidl transaction error when returning stream buffers to prevent hal from crashing when camera service is terminated. Bug: 218294681 Bug: 208890992 Test: P21 camera checklist Change-Id: I9af3851b9bd2d262a220c1a34b7bfd99cfa41a0a
-rw-r--r--common/hal/hidl_service/hidl_camera_device_session.cc8
-rw-r--r--common/hal/hidl_service/hidl_camera_provider.cc14
2 files changed, 19 insertions, 3 deletions
diff --git a/common/hal/hidl_service/hidl_camera_device_session.cc b/common/hal/hidl_service/hidl_camera_device_session.cc
index d0dc010..3af335e 100644
--- a/common/hal/hidl_service/hidl_camera_device_session.cc
+++ b/common/hal/hidl_service/hidl_camera_device_session.cc
@@ -304,7 +304,13 @@ void HidlCameraDeviceSession::ReturnStreamBuffers(
}
}
- hidl_device_callback_->returnStreamBuffers(hidl_return_buffers);
+ auto hidl_res =
+ hidl_device_callback_->returnStreamBuffers(hidl_return_buffers);
+ if (!hidl_res.isOk()) {
+ ALOGE("%s: return stream buffers transaction failed: %s.", __FUNCTION__,
+ hidl_res.description().c_str());
+ return;
+ }
}
status_t HidlCameraDeviceSession::InitializeBufferMapper() {
diff --git a/common/hal/hidl_service/hidl_camera_provider.cc b/common/hal/hidl_service/hidl_camera_provider.cc
index f9fdc43..528d23d 100644
--- a/common/hal/hidl_service/hidl_camera_provider.cc
+++ b/common/hal/hidl_service/hidl_camera_provider.cc
@@ -83,11 +83,16 @@ status_t HidlCameraProvider::Initialize() {
}
std::unique_lock<std::mutex> lock(callbacks_lock_);
- callbacks_->cameraDeviceStatusChange(
+ auto cb_status = callbacks_->cameraDeviceStatusChange(
"device@" +
device::V3_7::implementation::HidlCameraDevice::kDeviceVersion +
"/" + kProviderName + "/" + camera_id,
hidl_camera_device_status);
+ if (!cb_status.isOk()) {
+ ALOGE("%s: device status change transaction error: %s",
+ __FUNCTION__, cb_status.description().c_str());
+ return;
+ }
}),
.physical_camera_device_status_change = google_camera_hal::
PhysicalCameraDeviceStatusChangeFunc([this](
@@ -148,11 +153,16 @@ status_t HidlCameraProvider::Initialize() {
}
std::unique_lock<std::mutex> lock(callbacks_lock_);
- callbacks_->torchModeStatusChange(
+ auto cb_status = callbacks_->torchModeStatusChange(
"device@" +
device::V3_7::implementation::HidlCameraDevice::kDeviceVersion +
"/" + kProviderName + "/" + camera_id,
hidl_torch_status);
+ if (!cb_status.isOk()) {
+ ALOGE("%s: torch status change transaction error: %s",
+ __FUNCTION__, cb_status.description().c_str());
+ return;
+ }
}),
};