From 2c656796f416401ae48cd4a2e313dcb9e3aa256b Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Mon, 13 Apr 2020 17:36:49 -0700 Subject: [PATCH] Camera: Handle the case of calling Uid being cameraserver With HAL1-camera2 legacy implementation, the getCameraCharacteristics may be called without camera permission. So the cameraserver's Uid is used in that case. AppOpsManager returns MODE_IGNORED when the cameraserver's Uid is passed. Do not treat this as an error case. Bug: 153511543 Test: On Pixel 2 device, run "adb root; adb shell setprop persist.camera.HAL3.enabled 0; adb reboot", then "atest cts/tests/camera/CaptureRequestTest" Change-Id: I29aaa2045b14233537c737bf0738fbc32422540e --- services/camera/libcameraservice/CameraService.cpp | 8 ++++++-- services/camera/libcameraservice/CameraService.h | 1 + .../libcameraservice/api2/CameraOfflineSessionClient.cpp | 4 +++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index 9af1c36147..f92d6732d3 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -2742,7 +2742,7 @@ CameraService::BasicClient::BasicClient(const sp& cameraService, mClientPackageName(clientPackageName), mClientPid(clientPid), mClientUid(clientUid), mServicePid(servicePid), - mDisconnected(false), + mDisconnected(false), mUidIsTrusted(false), mAudioRestriction(hardware::camera2::ICameraDeviceUser::AUDIO_RESTRICTION_NONE), mRemoteBinder(remoteCallback) { @@ -2791,6 +2791,8 @@ CameraService::BasicClient::BasicClient(const sp& cameraService, if (getCurrentServingCall() != BinderCallType::HWBINDER) { mAppOpsManager = std::make_unique(); } + + mUidIsTrusted = isTrustedCallingUid(mClientUid); } CameraService::BasicClient::~BasicClient() { @@ -2905,7 +2907,9 @@ status_t CameraService::BasicClient::startCameraOps() { return PERMISSION_DENIED; } - if (res == AppOpsManager::MODE_IGNORED) { + // If the calling Uid is trusted (a native service), the AppOpsManager could + // return MODE_IGNORED. Do not treat such case as error. + if (!mUidIsTrusted && res == AppOpsManager::MODE_IGNORED) { ALOGI("Camera %s: Access for \"%s\" has been restricted", mCameraIdStr.string(), String8(mClientPackageName).string()); // Return the same error as for device policy manager rejection diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index 1adf15a712..18cf77a3d6 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -323,6 +323,7 @@ public: const uid_t mClientUid; const pid_t mServicePid; bool mDisconnected; + bool mUidIsTrusted; mutable Mutex mAudioRestrictionLock; int32_t mAudioRestriction; diff --git a/services/camera/libcameraservice/api2/CameraOfflineSessionClient.cpp b/services/camera/libcameraservice/api2/CameraOfflineSessionClient.cpp index 8f20685c59..237c24bb00 100644 --- a/services/camera/libcameraservice/api2/CameraOfflineSessionClient.cpp +++ b/services/camera/libcameraservice/api2/CameraOfflineSessionClient.cpp @@ -197,7 +197,9 @@ status_t CameraOfflineSessionClient::startCameraOps() { return PERMISSION_DENIED; } - if (res == AppOpsManager::MODE_IGNORED) { + // If the calling Uid is trusted (a native service), the AppOpsManager could + // return MODE_IGNORED. Do not treat such case as error. + if (!mUidIsTrusted && res == AppOpsManager::MODE_IGNORED) { ALOGI("Offline Camera %s: Access for \"%s\" has been restricted", mCameraIdStr.string(), String8(mClientPackageName).string()); // Return the same error as for device policy manager rejection