From 2cbceb9ebb80bbcbf9aa0e93ffde6ae48030b387 Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Tue, 14 Apr 2020 18:27:10 +0000 Subject: [PATCH] Fix deadlock when creating new OneTimePermissionUserManager Registering the broadcast receiver should happen outside of the lock. Change-Id: I8bbcd1ca3aff56d6d7ad4f4d63eec47671501493 Test: Set up work profile Fixes: 153999597 --- .../permission/OneTimePermissionUserManager.java | 11 ++++++++--- .../pm/permission/PermissionManagerService.java | 15 +++++++++------ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java b/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java index 1c4568095ce34..4bbe3733719e5 100644 --- a/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java +++ b/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java @@ -81,9 +81,6 @@ public class OneTimePermissionUserManager { mAlarmManager = context.getSystemService(AlarmManager.class); mPermissionControllerManager = context.getSystemService(PermissionControllerManager.class); mHandler = context.getMainThreadHandler(); - - // Listen for tracked uid being uninstalled - context.registerReceiver(mUninstallListener, new IntentFilter(Intent.ACTION_UID_REMOVED)); } /** @@ -170,6 +167,14 @@ public class OneTimePermissionUserManager { PROPERTY_KILLED_DELAY_CONFIG_KEY, DEFAULT_KILLED_DELAY_MILLIS); } + /** + * Register to listen for Uids being uninstalled. This must be done outside of the + * PermissionManagerService lock. + */ + void registerUninstallListener() { + mContext.registerReceiver(mUninstallListener, new IntentFilter(Intent.ACTION_UID_REMOVED)); + } + /** * A class which watches a package for inactivity and notifies the permission controller when * the package becomes inactive 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 ccc749232dc3d..244364ebbf0a8 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -3210,16 +3210,19 @@ public class PermissionManagerService extends IPermissionManager.Stub { } private OneTimePermissionUserManager getOneTimePermissionUserManager(@UserIdInt int userId) { + OneTimePermissionUserManager oneTimePermissionUserManager; synchronized (mLock) { - OneTimePermissionUserManager oneTimePermissionUserManager = + oneTimePermissionUserManager = mOneTimePermissionUserManagers.get(userId); - if (oneTimePermissionUserManager == null) { - oneTimePermissionUserManager = new OneTimePermissionUserManager( - mContext.createContextAsUser(UserHandle.of(userId), /*flags*/ 0)); - mOneTimePermissionUserManagers.put(userId, oneTimePermissionUserManager); + if (oneTimePermissionUserManager != null) { + return oneTimePermissionUserManager; } - return oneTimePermissionUserManager; + oneTimePermissionUserManager = new OneTimePermissionUserManager( + mContext.createContextAsUser(UserHandle.of(userId), /*flags*/ 0)); + mOneTimePermissionUserManagers.put(userId, oneTimePermissionUserManager); } + oneTimePermissionUserManager.registerUninstallListener(); + return oneTimePermissionUserManager; } @Override