summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hai Zhang <zhanghai@google.com> 2024-01-24 17:47:50 +0000
committer Hai Zhang <zhanghai@google.com> 2024-01-24 17:48:11 +0000
commitc78e8c3cada1a84ef2fae1b6826a3a5c92a11d05 (patch)
treea4ff6d5464bebcb82c6c5ffe0b7e580031800883
parentd91d78d8a43a2d7b75deef0adf05fabcf094bc99 (diff)
Fix NPEs in DevicePermissionPolicy.
Similar to ag/25910620 Fixes: 322101844 Test: presubmit Change-Id: I33e6999d818d899dc29cee8f4644918a68cc27b4
-rw-r--r--services/permission/java/com/android/server/permission/access/permission/DevicePermissionPolicy.kt11
1 files changed, 10 insertions, 1 deletions
diff --git a/services/permission/java/com/android/server/permission/access/permission/DevicePermissionPolicy.kt b/services/permission/java/com/android/server/permission/access/permission/DevicePermissionPolicy.kt
index a0fb0138e5e5..24d49523b9d1 100644
--- a/services/permission/java/com/android/server/permission/access/permission/DevicePermissionPolicy.kt
+++ b/services/permission/java/com/android/server/permission/access/permission/DevicePermissionPolicy.kt
@@ -94,7 +94,9 @@ class DevicePermissionPolicy : SchemePolicy() {
isSystemUpdated: Boolean
) {
packageNames.forEachIndexed { _, packageName ->
- val packageState = newState.externalState.packageStates[packageName]!!
+ // The package may still be removed even if it was once notified as installed.
+ val packageState = newState.externalState.packageStates[packageName]
+ ?: return@forEachIndexed
trimPermissionStates(packageState.appId)
}
}
@@ -245,6 +247,13 @@ class DevicePermissionPolicy : SchemePolicy() {
flagMask: Int,
flagValues: Int
): Boolean {
+ if (userId !in newState.userStates) {
+ // Despite that we check UserManagerInternal.exists() in PermissionService, we may still
+ // sometimes get race conditions between that check and the actual mutateState() call.
+ // This should rarely happen but at least we should not crash.
+ Slog.e(LOG_TAG, "Unable to update permission flags for missing user $userId")
+ return false
+ }
val oldFlags =
newState.userStates[userId]!!
.appIdDevicePermissionFlags[appId]