diff options
author | 2025-03-14 11:59:41 -0700 | |
---|---|---|
committer | 2025-03-17 15:38:05 -0700 | |
commit | a4822a1748059d2c6870d1afe3cda13221432fd5 (patch) | |
tree | 51ff894dd09486c325c4955e4e3edaeb72f4814c | |
parent | 03e402ab41f66c460c3814956c800d22939b3737 (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.kt | 7 |
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 |