From 6821cae12aeb7d7bcb4875e3c64693e11efe6a8f Mon Sep 17 00:00:00 2001 From: Adam Bookatz Date: Tue, 1 Feb 2022 14:49:43 -0800 Subject: [PATCH] Fix VirtualDeviceManagerService startUser crash Service crashed on certain secondary user startups because the system server was being denied permission within the system server. Test: on headless user 0 mode device, start a secondary user and ensure that the service doesn't crash on startup Test: atest CreateUsersNoAppCrashesTest (with ag/16771988) Bug: 217246676 Change-Id: I98ba584553ca0cc0b03fc9196c841645faca1ddc --- .../server/companion/CompanionDeviceManagerService.java | 8 ++++---- .../com/android/server/companion/PermissionsUtils.java | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index cfd37988d234c..4807953aed46f 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -35,10 +35,10 @@ import static com.android.internal.util.function.pooled.PooledLambda.obtainRunna import static com.android.server.companion.AssociationStore.CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED; import static com.android.server.companion.PermissionsUtils.checkCallerCanManageAssociationsForPackage; import static com.android.server.companion.PermissionsUtils.checkCallerCanManageCompanionDevice; -import static com.android.server.companion.PermissionsUtils.enforceCallerCanInteractWithUserId; import static com.android.server.companion.PermissionsUtils.enforceCallerCanManageAssociationsForPackage; import static com.android.server.companion.PermissionsUtils.enforceCallerCanManageCompanionDevice; import static com.android.server.companion.PermissionsUtils.enforceCallerIsSystemOr; +import static com.android.server.companion.PermissionsUtils.enforceCallerIsSystemOrCanInteractWithUserId; import static com.android.server.companion.RolesUtils.addRoleHolderForAssociation; import static com.android.server.companion.RolesUtils.removeRoleHolderForAssociation; @@ -459,7 +459,7 @@ public class CompanionDeviceManagerService extends SystemService @Override public List getAllAssociationsForUser(int userId) throws RemoteException { - enforceCallerCanInteractWithUserId(getContext(), userId); + enforceCallerIsSystemOrCanInteractWithUserId(getContext(), userId); enforceCallerCanManageCompanionDevice(getContext(), "getAllAssociationsForUser"); return mAssociationStore.getAssociationsForUser(userId); @@ -468,7 +468,7 @@ public class CompanionDeviceManagerService extends SystemService @Override public void addOnAssociationsChangedListener(IOnAssociationsChangedListener listener, int userId) { - enforceCallerCanInteractWithUserId(getContext(), userId); + enforceCallerIsSystemOrCanInteractWithUserId(getContext(), userId); enforceCallerCanManageCompanionDevice(getContext(), "addOnAssociationsChangedListener"); @@ -478,7 +478,7 @@ public class CompanionDeviceManagerService extends SystemService @Override public void removeOnAssociationsChangedListener(IOnAssociationsChangedListener listener, int userId) { - enforceCallerCanInteractWithUserId(getContext(), userId); + enforceCallerIsSystemOrCanInteractWithUserId(getContext(), userId); enforceCallerCanManageCompanionDevice( getContext(), "removeOnAssociationsChangedListener"); diff --git a/services/companion/java/com/android/server/companion/PermissionsUtils.java b/services/companion/java/com/android/server/companion/PermissionsUtils.java index b981ff1d43c96..885068de2e663 100644 --- a/services/companion/java/com/android/server/companion/PermissionsUtils.java +++ b/services/companion/java/com/android/server/companion/PermissionsUtils.java @@ -112,6 +112,12 @@ final class PermissionsUtils { context.enforceCallingPermission(INTERACT_ACROSS_USERS, null); } + static void enforceCallerIsSystemOrCanInteractWithUserId(@NonNull Context context, int userId) { + if (getCallingUid() == SYSTEM_UID) return; + + enforceCallerCanInteractWithUserId(context, userId); + } + static boolean checkCallerIsSystemOr(@UserIdInt int userId, @NonNull String packageName) { final int callingUid = getCallingUid(); if (callingUid == SYSTEM_UID) return true;