summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Atneya Nair <atneya@google.com> 2025-03-14 11:59:41 -0700
committer Atneya Nair <atneya@google.com> 2025-03-17 15:38:05 -0700
commita4822a1748059d2c6870d1afe3cda13221432fd5 (patch)
tree51ff894dd09486c325c4955e4e3edaeb72f4814c
parent03e402ab41f66c460c3814956c800d22939b3737 (diff)
[permission] Debugging access state concurrency
Add a fail fast check to ensure that we aren't accidentally mutating an an object which is reachable from old state. This shouldn't happen, but we are getting ConcurrentException in ArrayMap. Bug: 401768134 Test: boot Flag: EXEMPT debugging Change-Id: I00c122200d48bd18197745e7c80e7d729361215d
-rw-r--r--services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt7
1 files changed, 7 insertions, 0 deletions
diff --git a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt
index 232bb83fdf9f..5a140d53a4d8 100644
--- a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt
+++ b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt
@@ -1753,6 +1753,13 @@ class AppIdPermissionPolicy : SchemePolicy() {
}
val appIdPermissionFlags = newState.mutateUserState(userId)!!.mutateAppIdPermissionFlags()
val permissionFlags = appIdPermissionFlags.mutateOrPut(appId) { MutableIndexedMap() }
+ // for debugging possible races TODO(b/401768134)
+ oldState.userStates[userId]?.appIdPermissionFlags[appId]?.map?.let {
+ if (permissionFlags.map === it) {
+ throw IllegalStateException("Unexpected sharing between old/new state")
+ }
+ }
+
permissionFlags.putWithDefault(permissionName, newFlags, 0)
if (permissionFlags.isEmpty()) {
appIdPermissionFlags -= appId