diff options
author | Shuzhen Wang <shuzhenwang@google.com> | 2018-03-29 23:34:51 -0700 |
---|---|---|
committer | Shuzhen Wang <shuzhenwang@google.com> | 2018-03-29 23:34:51 -0700 |
commit | 448b7e398afd63aa00b5dd10a209254fea91946c (patch) | |
tree | bfb22d68cd44ddd6c338db0bc89daebd463782c8 /camera/device/3.4/default/CameraDeviceSession.cpp | |
parent | 55b92198fb650795183ffd25c07442437fec94ec (diff) |
Camera: Validate physical camera related metadata field from legacy HAL
Make sure that num_physcam_metadata, physcam_ids, and physcam_metadata
returned from process_capture_result is sane.
Test: LogicalCameraDeviceTest
Bug: 77218595
Change-Id: Ic4d9823569fb86b20ab2ab21edfc32a0e9f5c9c7
Diffstat (limited to 'camera/device/3.4/default/CameraDeviceSession.cpp')
-rw-r--r-- | camera/device/3.4/default/CameraDeviceSession.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/camera/device/3.4/default/CameraDeviceSession.cpp b/camera/device/3.4/default/CameraDeviceSession.cpp index ad7f6f515e..550d65a880 100644 --- a/camera/device/3.4/default/CameraDeviceSession.cpp +++ b/camera/device/3.4/default/CameraDeviceSession.cpp @@ -51,6 +51,32 @@ CameraDeviceSession::CameraDeviceSession( } } } + + camera_metadata_entry_t capabilities = + mDeviceInfo.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); + bool isLogicalMultiCamera = false; + for (size_t i = 0; i < capabilities.count; i++) { + if (capabilities.data.u8[i] == + ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) { + isLogicalMultiCamera = true; + break; + } + } + if (isLogicalMultiCamera) { + camera_metadata_entry entry = + mDeviceInfo.find(ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS); + const uint8_t* ids = entry.data.u8; + size_t start = 0; + for (size_t i = 0; i < entry.count; ++i) { + if (ids[i] == '\0') { + if (start != i) { + const char* physicalId = reinterpret_cast<const char*>(ids+start); + mPhysicalCameraIds.emplace(physicalId); + } + start = i + 1; + } + } + } } CameraDeviceSession::~CameraDeviceSession() { @@ -456,9 +482,19 @@ void CameraDeviceSession::sProcessCaptureResult_3_4( return; } + if (hal_result->num_physcam_metadata > d->mPhysicalCameraIds.size()) { + ALOGE("%s: Fatal: Invalid num_physcam_metadata %u", __FUNCTION__, + hal_result->num_physcam_metadata); + 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]; + if (d->mPhysicalCameraIds.find(physicalId) == d->mPhysicalCameraIds.end()) { + ALOGE("%s: Fatal: Invalid physcam_ids[%u]: %s", __FUNCTION__, + i, hal_result->physcam_ids[i]); + return; + } V3_2::CameraMetadata physicalMetadata; V3_2::implementation::convertToHidl(hal_result->physcam_metadata[i], &physicalMetadata); PhysicalCameraMetadata physicalCameraMetadata = { |