diff options
3 files changed, 45 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index da89b9e7a599..7faebb543f76 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -3044,7 +3044,12 @@ class PackageManagerShellCommand extends ShellCommand { translateUserId(userId, UserHandle.USER_NULL, "runSetUserRestriction"); final IUserManager um = IUserManager.Stub.asInterface( ServiceManager.getService(Context.USER_SERVICE)); - um.setUserRestriction(restriction, value, translatedUserId); + try { + um.setUserRestriction(restriction, value, translatedUserId); + } catch (IllegalArgumentException e) { + getErrPrintWriter().println(e.getMessage()); + return 1; + } return 0; } diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index a3bca4c8976e..3864415dabad 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -2630,6 +2630,11 @@ public class UserManagerService extends IUserManager.Stub { if (!UserRestrictionsUtils.isValidRestriction(key)) { return; } + + if (!userExists(userId)) { + throw new IllegalArgumentException("Cannot set user restriction. " + + "User with this id does not exist"); + } synchronized (mRestrictionsLock) { // Note we can't modify Bundles stored in mBaseUserRestrictions directly, so create // a copy. @@ -3214,6 +3219,22 @@ public class UserManagerService extends IUserManager.Stub { } /** + * Checks whether user with a given ID exists. + * @param id User id to be checked. + */ + @VisibleForTesting + boolean userExists(int id) { + synchronized (mUsersLock) { + for (int userId : mUserIds) { + if (userId == id) { + return true; + } + } + } + return false; + } + + /** * Returns an array of user ids, including pre-created users. * * <p>This method should only used for the specific cases that need to handle pre-created users; @@ -3736,7 +3757,6 @@ public class UserManagerService extends IUserManager.Stub { } } - updateUserIds(); initDefaultGuestRestrictions(); writeUserLP(userData); @@ -4933,6 +4953,7 @@ public class UserManagerService extends IUserManager.Stub { synchronized (mUsersLock) { mUsers.put(userInfo.id, userData); } + updateUserIds(); return userData; } diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java index b1ad8ec1cb66..e04edc6d7db2 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java @@ -16,6 +16,7 @@ package com.android.server.pm; +import static android.os.UserManager.DISALLOW_BLUETOOTH; import static android.os.UserManager.DISALLOW_USER_SWITCH; import static com.google.common.truth.Truth.assertThat; @@ -40,6 +41,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.server.LocalServices; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -174,6 +176,21 @@ public class UserManagerServiceTest { } @Test + public void testSetUserRestrictionWithIncorrectID() throws Exception { + int incorrectId = 1; + while (mUserManagerService.userExists(incorrectId)) { + incorrectId++; + } + try { + mUserManagerService.setUserRestriction(DISALLOW_BLUETOOTH, true, incorrectId); + Assert.fail(); + } catch (IllegalArgumentException e) { + //Exception is expected to be thrown if user ID does not exist. + // IllegalArgumentException thrown means this test is successful. + } + } + + @Test public void assertIsUserSwitcherEnabledOnMultiUserSettings() throws Exception { int userId = ActivityManager.getCurrentUser(); resetUserSwitcherEnabled(); |