summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java20
1 files changed, 16 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index ff661a8860d0..c03b98df326a 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -3369,16 +3369,28 @@ public class PermissionManagerService extends IPermissionManager.Stub {
SystemConfig.getInstance().getSplitPermissions());
}
+ @NonNull
private OneTimePermissionUserManager getOneTimePermissionUserManager(@UserIdInt int userId) {
OneTimePermissionUserManager oneTimePermissionUserManager;
synchronized (mLock) {
- oneTimePermissionUserManager =
- mOneTimePermissionUserManagers.get(userId);
+ oneTimePermissionUserManager = mOneTimePermissionUserManagers.get(userId);
+ if (oneTimePermissionUserManager != null) {
+ return oneTimePermissionUserManager;
+ }
+ }
+ // We cannot create a new instance of OneTimePermissionUserManager while holding our own
+ // lock, which may lead to a deadlock with the package manager lock. So we do it in a
+ // retry-like way, and just discard the newly created instance if someone else managed to be
+ // a little bit faster than us when we dropped our own lock.
+ final OneTimePermissionUserManager newOneTimePermissionUserManager =
+ new OneTimePermissionUserManager(mContext.createContextAsUser(UserHandle.of(userId),
+ /*flags*/ 0));
+ synchronized (mLock) {
+ oneTimePermissionUserManager = mOneTimePermissionUserManagers.get(userId);
if (oneTimePermissionUserManager != null) {
return oneTimePermissionUserManager;
}
- oneTimePermissionUserManager = new OneTimePermissionUserManager(
- mContext.createContextAsUser(UserHandle.of(userId), /*flags*/ 0));
+ oneTimePermissionUserManager = newOneTimePermissionUserManager;
mOneTimePermissionUserManagers.put(userId, oneTimePermissionUserManager);
}
oneTimePermissionUserManager.registerUninstallListener();