diff options
| author | 2024-09-19 14:23:20 -0700 | |
|---|---|---|
| committer | 2024-09-19 14:37:29 -0700 | |
| commit | af274a1b252752b385bceb14f1f88e361e2c91e5 (patch) | |
| tree | 981a02bd5fd34e17f3143db3055bdb1879609611 | |
| parent | 5268d622137059a6c0daca8a54a6481a5394a69a (diff) | |
Camera: Fix race condition in CameraManager
cameraIdHasConcurrentStreamsLocked needs to hold
CameraManagerGlobal.mLock. Holding CameraManager.mLock isn't sufficient.
Flag: EXEMPT bugfix
Test: CameraManagerTest
Bug: 368402060
Change-Id: Iee92c5d8d7ea68447d6730f0cc34632171c6b689
| -rw-r--r-- | core/java/android/hardware/camera2/CameraManager.java | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index d40b2e342fbb..21627920f598 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -818,7 +818,7 @@ public final class CameraManager { } boolean hasConcurrentStreams = - CameraManagerGlobal.get().cameraIdHasConcurrentStreamsLocked(cameraId, + CameraManagerGlobal.get().cameraIdHasConcurrentStreams(cameraId, mContext.getDeviceId(), getDevicePolicyFromContext(mContext)); metadata.setHasMandatoryConcurrentStreams(hasConcurrentStreams); @@ -2629,24 +2629,26 @@ public final class CameraManager { * @return Whether the camera device was found in the set of combinations returned by * getConcurrentCameraIds */ - public boolean cameraIdHasConcurrentStreamsLocked(String cameraId, int deviceId, + public boolean cameraIdHasConcurrentStreams(String cameraId, int deviceId, int devicePolicy) { - DeviceCameraInfo info = new DeviceCameraInfo(cameraId, - devicePolicy == DEVICE_POLICY_DEFAULT ? DEVICE_ID_DEFAULT : deviceId); - if (!mDeviceStatus.containsKey(info)) { - // physical camera ids aren't advertised in concurrent camera id combinations. - if (DEBUG) { - Log.v(TAG, " physical camera id " + cameraId + " is hidden." + - " Available logical camera ids : " + mDeviceStatus); + synchronized (mLock) { + DeviceCameraInfo info = new DeviceCameraInfo(cameraId, + devicePolicy == DEVICE_POLICY_DEFAULT ? DEVICE_ID_DEFAULT : deviceId); + if (!mDeviceStatus.containsKey(info)) { + // physical camera ids aren't advertised in concurrent camera id combinations. + if (DEBUG) { + Log.v(TAG, " physical camera id " + cameraId + " is hidden." + + " Available logical camera ids : " + mDeviceStatus); + } + return false; } - return false; - } - for (Set<DeviceCameraInfo> comb : mConcurrentCameraIdCombinations) { - if (comb.contains(info)) { - return true; + for (Set<DeviceCameraInfo> comb : mConcurrentCameraIdCombinations) { + if (comb.contains(info)) { + return true; + } } + return false; } - return false; } public void setTorchMode( |