summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAbhinav Sohane <asohan@codeaurora.org>2017-09-19 14:26:10 +0530
committerArne Coucheron <arco68@gmail.com>2017-11-26 20:24:02 +0100
commit621821f3191754678125a44a1f9b4dbd69f76541 (patch)
tree580616e0acc877e9000928a6d22c253303492fd0
parentf23d41826dafb6b85d3e7206321014e593db91b1 (diff)
downloadandroid_hardware_interfaces-621821f3191754678125a44a1f9b4dbd69f76541.tar.gz
android_hardware_interfaces-621821f3191754678125a44a1f9b4dbd69f76541.tar.bz2
android_hardware_interfaces-621821f3191754678125a44a1f9b4dbd69f76541.zip
Camera:CameraDevice@1.0: Added mutex lock for mMemoryMap.lineage-15.0
Issue: Camera provider crashing due __next_prime overflow while accessing mMemoryMap. Solution: Added mMemoryMapLock for securing mMemoryMap access from multiple threads. Change-Id: I6caa0639a11ff458775a896198bc5a964a5b7a35 CRs-fixed:2068346
-rw-r--r--camera/device/1.0/default/CameraDevice.cpp26
-rw-r--r--camera/device/1.0/default/CameraDevice_1_0.h2
2 files changed, 23 insertions, 5 deletions
diff --git a/camera/device/1.0/default/CameraDevice.cpp b/camera/device/1.0/default/CameraDevice.cpp
index c53c0d8b5..5bb97a4bf 100644
--- a/camera/device/1.0/default/CameraDevice.cpp
+++ b/camera/device/1.0/default/CameraDevice.cpp
@@ -377,10 +377,13 @@ camera_memory_t* CameraDevice::sGetMemory(int fd, size_t buf_size, uint_t num_bu
hidl_handle hidlHandle = mem->mHidlHandle;
MemoryId id = object->mDeviceCallback->registerMemory(hidlHandle, buf_size, num_bufs);
mem->handle.mId = id;
- if (object->mMemoryMap.count(id) != 0) {
- ALOGE("%s: duplicate MemoryId %d returned by client!", __FUNCTION__, id);
+ {
+ Mutex::Autolock _l(object->mMemoryMapLock);
+ if (object->mMemoryMap.count(id) != 0) {
+ ALOGE("%s: duplicate MemoryId %d returned by client!", __FUNCTION__, id);
+ }
+ object->mMemoryMap[id] = mem;
}
- object->mMemoryMap[id] = mem;
mem->handle.mDevice = object;
return &mem->handle;
}
@@ -398,7 +401,10 @@ void CameraDevice::sPutMemory(camera_memory_t *data) {
ALOGE("%s: camera HAL return memory while camera is not opened!", __FUNCTION__);
}
device->mDeviceCallback->unregisterMemory(mem->handle.mId);
- device->mMemoryMap.erase(mem->handle.mId);
+ {
+ Mutex::Autolock _l(device->mMemoryMapLock);
+ device->mMemoryMap.erase(mem->handle.mId);
+ }
mem->decStrong(mem);
}
@@ -826,7 +832,17 @@ void CameraDevice::releaseRecordingFrameLocked(
return;
}
if (mDevice->ops->release_recording_frame) {
- CameraHeapMemory* camMemory = mMemoryMap.at(memId);
+ CameraHeapMemory* camMemory;
+ {
+ Mutex::Autolock _l(mMemoryMapLock);
+ auto it = mMemoryMap.find(memId);
+ if (it == mMemoryMap.end() || it->second == nullptr) {
+ ALOGE("%s unknown memoryId %d", __FUNCTION__, memId);
+ return;
+ }
+ camMemory = it->second;
+ }
+
if (bufferIndex >= camMemory->mNumBufs) {
ALOGE("%s: bufferIndex %d exceeds number of buffers %d",
__FUNCTION__, bufferIndex, camMemory->mNumBufs);
diff --git a/camera/device/1.0/default/CameraDevice_1_0.h b/camera/device/1.0/default/CameraDevice_1_0.h
index c07859631..a8879d43b 100644
--- a/camera/device/1.0/default/CameraDevice_1_0.h
+++ b/camera/device/1.0/default/CameraDevice_1_0.h
@@ -165,6 +165,8 @@ private:
sp<ICameraDeviceCallback> mDeviceCallback = nullptr;
+ mutable Mutex mMemoryMapLock; // gating access to mMemoryMap
+ // must not hold mLock after this lock is acquired
std::unordered_map<MemoryId, CameraHeapMemory*> mMemoryMap;
bool mMetadataMode = false;