diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index 8354ed5f94..3b93a4d091 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -968,11 +968,14 @@ Status CameraService::validateClientPermissionsLocked(const String8& cameraId, // Make sure the UID is in an active state to use the camera if (!mUidPolicy->isUidActive(callingUid, String16(clientName8))) { + int32_t procState = mUidPolicy->getProcState(callingUid); ALOGE("Access Denial: can't use the camera from an idle UID pid=%d, uid=%d", clientPid, clientUid); return STATUS_ERROR_FMT(ERROR_DISABLED, - "Caller \"%s\" (PID %d, UID %d) cannot open camera \"%s\" from background", - clientName8.string(), clientUid, clientPid, cameraId.string()); + "Caller \"%s\" (PID %d, UID %d) cannot open camera \"%s\" from background (" + "calling UID %d proc state %" PRId32 ")", + clientName8.string(), clientUid, clientPid, cameraId.string(), + callingUid, procState); } // If sensor privacy is enabled then prevent access to the camera @@ -2731,6 +2734,19 @@ bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPack return active; } +int32_t CameraService::UidPolicy::getProcState(uid_t uid) { + Mutex::Autolock _l(mUidLock); + return getProcStateLocked(uid); +} + +int32_t CameraService::UidPolicy::getProcStateLocked(uid_t uid) { + int32_t procState = ActivityManager::PROCESS_STATE_UNKNOWN; + if (mMonitoredUids.find(uid) != mMonitoredUids.end()) { + procState = mMonitoredUids[uid].first; + } + return procState; +} + void CameraService::UidPolicy::UidPolicy::addOverrideUid(uid_t uid, String16 callingPackage, bool active) { updateOverrideUid(uid, callingPackage, active, true); diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index 344dd92cfc..643b8cb130 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -542,6 +542,7 @@ private: void unregisterSelf(); bool isUidActive(uid_t uid, String16 callingPackage); + int32_t getProcState(uid_t uid); void onUidGone(uid_t uid, bool disabled); void onUidActive(uid_t uid); @@ -558,6 +559,7 @@ private: virtual void binderDied(const wp &who); private: bool isUidActiveLocked(uid_t uid, String16 callingPackage); + int32_t getProcStateLocked(uid_t uid); void updateOverrideUid(uid_t uid, String16 callingPackage, bool active, bool insert); Mutex mUidLock;