summaryrefslogtreecommitdiffstats
path: root/camera/device
diff options
context:
space:
mode:
authorShuzhen Wang <shuzhenwang@google.com>2018-03-09 15:58:43 -0800
committerShuzhen Wang <shuzhenwang@google.com>2018-03-09 16:01:06 -0800
commit17d817a889da6be3f77da83ef0b3547461b4a6a6 (patch)
treed584459e9e51318ff731a37da028a9619abd237d /camera/device
parenta3819421700f9a743c8c515029cac798555946f6 (diff)
downloadandroid_hardware_interfaces-17d817a889da6be3f77da83ef0b3547461b4a6a6.tar.gz
android_hardware_interfaces-17d817a889da6be3f77da83ef0b3547461b4a6a6.tar.bz2
android_hardware_interfaces-17d817a889da6be3f77da83ef0b3547461b4a6a6.zip
Camera: Do not forward capture_result in error condition
If HAL calls process_capture_result with invalid buffers, the HIDL wrapper shouldn't forward it to camera service, since the CaptureResult structure may not be completely initialized. Test: Run GoogleCamera Bug: 74433802 Change-Id: Iaf20b542af5b11ffbedf709e99137b69d77a9ad3
Diffstat (limited to 'camera/device')
-rw-r--r--camera/device/3.2/default/CameraDeviceSession.cpp17
-rw-r--r--camera/device/3.2/default/CameraDeviceSession.h2
-rw-r--r--camera/device/3.4/default/CameraDeviceSession.cpp8
3 files changed, 16 insertions, 11 deletions
diff --git a/camera/device/3.2/default/CameraDeviceSession.cpp b/camera/device/3.2/default/CameraDeviceSession.cpp
index 975fb0134..5f89cde97 100644
--- a/camera/device/3.2/default/CameraDeviceSession.cpp
+++ b/camera/device/3.2/default/CameraDeviceSession.cpp
@@ -1198,7 +1198,7 @@ Return<void> CameraDeviceSession::close() {
return Void();
}
-void CameraDeviceSession::constructCaptureResult(CaptureResult& result,
+status_t CameraDeviceSession::constructCaptureResult(CaptureResult& result,
const camera3_capture_result *hal_result) {
uint32_t frameNumber = hal_result->frame_number;
bool hasInputBuf = (hal_result->input_buffer != nullptr);
@@ -1213,7 +1213,7 @@ void CameraDeviceSession::constructCaptureResult(CaptureResult& result,
if (mInflightBuffers.count(key) != 1) {
ALOGE("%s: input buffer for stream %d frame %d is not inflight!",
__FUNCTION__, streamId, frameNumber);
- return;
+ return -EINVAL;
}
}
@@ -1224,7 +1224,7 @@ void CameraDeviceSession::constructCaptureResult(CaptureResult& result,
if (mInflightBuffers.count(key) != 1) {
ALOGE("%s: output buffer for stream %d frame %d is not inflight!",
__FUNCTION__, streamId, frameNumber);
- return;
+ return -EINVAL;
}
}
}
@@ -1344,7 +1344,7 @@ void CameraDeviceSession::constructCaptureResult(CaptureResult& result,
ALOGV("%s: inflight buffer queue is now empty!", __FUNCTION__);
}
}
-
+ return OK;
}
/**
@@ -1356,10 +1356,11 @@ void CameraDeviceSession::sProcessCaptureResult(
CameraDeviceSession *d =
const_cast<CameraDeviceSession*>(static_cast<const CameraDeviceSession*>(cb));
- CaptureResult result;
- d->constructCaptureResult(result, hal_result);
-
- d->mResultBatcher.processCaptureResult(result);
+ CaptureResult result = {};
+ status_t ret = d->constructCaptureResult(result, hal_result);
+ if (ret == OK) {
+ d->mResultBatcher.processCaptureResult(result);
+ }
}
void CameraDeviceSession::sNotify(
diff --git a/camera/device/3.2/default/CameraDeviceSession.h b/camera/device/3.2/default/CameraDeviceSession.h
index 61db67106..269cc06f1 100644
--- a/camera/device/3.2/default/CameraDeviceSession.h
+++ b/camera/device/3.2/default/CameraDeviceSession.h
@@ -327,7 +327,7 @@ protected:
static callbacks_process_capture_result_t sProcessCaptureResult;
static callbacks_notify_t sNotify;
- void constructCaptureResult(CaptureResult& result,
+ status_t constructCaptureResult(CaptureResult& result,
const camera3_capture_result *hal_result);
private:
diff --git a/camera/device/3.4/default/CameraDeviceSession.cpp b/camera/device/3.4/default/CameraDeviceSession.cpp
index b03235767..ad7f6f515 100644
--- a/camera/device/3.4/default/CameraDeviceSession.cpp
+++ b/camera/device/3.4/default/CameraDeviceSession.cpp
@@ -450,8 +450,12 @@ void CameraDeviceSession::sProcessCaptureResult_3_4(
CameraDeviceSession *d =
const_cast<CameraDeviceSession*>(static_cast<const CameraDeviceSession*>(cb));
- CaptureResult result;
- d->constructCaptureResult(result.v3_2, hal_result);
+ CaptureResult result = {};
+ status_t ret = d->constructCaptureResult(result.v3_2, hal_result);
+ if (ret != OK) {
+ return;
+ }
+
result.physicalCameraMetadata.resize(hal_result->num_physcam_metadata);
for (uint32_t i = 0; i < hal_result->num_physcam_metadata; i++) {
std::string physicalId = hal_result->physcam_ids[i];