From ad44816045b6f89d57533bbe4650ddd881a6b4da Mon Sep 17 00:00:00 2001 From: Robin Lee Date: Thu, 26 Nov 2020 01:44:15 +0100 Subject: [PATCH 1/2] adb shell pm: create context as the right user Prevents cross-user shell commands throwing an exception like the following and crashing PackageManagerShellCommand. java.lang.SecurityException: You need INTERACT_ACROSS_USERS or MANAGE_USERS permission to: check isUserUnlockingOrUnlocked at UserManagerService.checkManageOrInteractPermissionIfCallerInOtherProfileGroup(UserManagerService.java:1534) at UserManagerService.isUserUnlockingOrUnlocked(UserManagerService.java:1472) at PackageManagerService.updateFlags(PackageManagerService.java:5410) at PackageManagerService.updateFlagsForPackage(PackageManagerService.java:5439) at PackageManagerService.updateFlagsForApplication(PackageManagerService.java:5446) at PackageManagerService.getApplicationInfoInternal(PackageManagerService.java:5120) at PackageManagerService.getApplicationInfo(PackageManagerService.java:5108) at PackageManager.getApplicationInfoAsUserUncached(PackageManager.java:8785) at PackageManager.access$000(PackageManager.java:102) at PackageManager$1.recompute(PackageManager.java:8798) at PackageManager$1.recompute(PackageManager.java:8795) at PropertyInvalidatedCache.query(PropertyInvalidatedCache.java:455) at PackageManager.getApplicationInfoAsUserCached(PackageManager.java:8813) at ActivityThread.getPackageInfo(ActivityThread.java:2275) at ContextImpl.createPackageContextAsUser(ContextImpl.java:2359) at ContextImpl.createPackageContext(ContextImpl.java:2346) at PackageManagerShellCommand.(PackageManagerShellCommand.java:162) at PackageManagerService.onShellCommand(PackageManagerService.java:22329) at Binder.shellCommand(Binder.java:949) at Binder.onTransact(Binder.java:832) at IPackageManager$Stub.onTransact(IPackageManager.java:4767) at PackageManagerService.onTransact(PackageManagerService.java:4505) at Binder.execTransactInternal(Binder.java:1186) at Binder.execTransact(Binder.java:1145) Bug: 159157348 Change-Id: I4854a3100f55b3190f9ad974a507be64ca9defa8 --- .../java/com/android/server/pm/PackageManagerShellCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 9aa1a621a7600..2996cd13f7b15 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -159,7 +159,8 @@ class PackageManagerShellCommand extends ShellCommand { mInterface = service; mPermissionManager = permissionManager; try { - mShellPackageContext = context.createPackageContext("com.android.shell", 0); + mShellPackageContext = context.createPackageContextAsUser( + "com.android.shell", 0, Binder.getCallingUserHandle()); } catch (NameNotFoundException e) { // should not happen throw new RuntimeException(e); From 2cae9f6275ac331a0a1be32560566e052b7d065c Mon Sep 17 00:00:00 2001 From: Robin Lee Date: Thu, 26 Nov 2020 01:53:08 +0100 Subject: [PATCH 2/2] shell pm: move context creation to where it's used If something went wrong with the shell package, it's useful for pm commands to still work so that a developer is still able to put things back the way they were. Test: atest CtsNativeMediaAAudioTestCases --user-type secondary_user Bug: 159157348 Change-Id: I9d3b4f8f93496a5df2055681bd88c61adc435408 --- .../server/pm/PackageManagerShellCommand.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 2996cd13f7b15..9720819a62ab8 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -146,7 +146,7 @@ class PackageManagerShellCommand extends ShellCommand { final IPackageManager mInterface; final IPermissionManager mPermissionManager; - final Context mShellPackageContext; + final Context mContext; final private WeakHashMap mResourceCache = new WeakHashMap(); int mTargetUser; @@ -158,13 +158,7 @@ class PackageManagerShellCommand extends ShellCommand { PackageManagerService service, IPermissionManager permissionManager, Context context) { mInterface = service; mPermissionManager = permissionManager; - try { - mShellPackageContext = context.createPackageContextAsUser( - "com.android.shell", 0, Binder.getCallingUserHandle()); - } catch (NameNotFoundException e) { - // should not happen - throw new RuntimeException(e); - } + mContext = context; } @Override @@ -487,8 +481,17 @@ class PackageManagerShellCommand extends ShellCommand { return 1; } + final Context shellPackageContext; + try { + shellPackageContext = mContext.createPackageContextAsUser( + "com.android.shell", 0, Binder.getCallingUserHandle()); + } catch (NameNotFoundException e) { + // should not happen + throw new RuntimeException(e); + } + final LocalIntentReceiver receiver = new LocalIntentReceiver(); - RollbackManager rm = mShellPackageContext.getSystemService(RollbackManager.class); + RollbackManager rm = shellPackageContext.getSystemService(RollbackManager.class); RollbackInfo rollback = null; for (RollbackInfo r : rm.getAvailableRollbacks()) { for (PackageRollbackInfo info : r.getPackages()) {