From eb90e9679db760cdb7affe444631cbcad461fbd7 Mon Sep 17 00:00:00 2001 From: Ethan Lee Date: Tue, 29 Nov 2022 02:22:06 +0000 Subject: Fix UserController to not throw in stopUser Return an USER_OP_* instead of throwing an IllegalException Test: atest UserControllerTest#stopUser_invalidUser UserControllerTest#stopUser_systemUser UserControllerTest#stopUser_currentUser Fixes: 259740023 Change-Id: I7e50412e028d225b7c97e113a3e4aac138da2314 --- .../java/com/android/server/am/UserController.java | 5 ++-- .../com/android/server/am/UserControllerTest.java | 33 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 4d86140816ea..d0d0a6f2ff30 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -958,9 +958,8 @@ class UserController implements Handler.Callback { int stopUser(final int userId, final boolean force, boolean allowDelayedLocking, final IStopUserCallback stopUserCallback, KeyEvictedCallback keyEvictedCallback) { checkCallingPermission(INTERACT_ACROSS_USERS_FULL, "stopUser"); - if (userId < 0 || userId == UserHandle.USER_SYSTEM) { - throw new IllegalArgumentException("Can't stop system user " + userId); - } + Preconditions.checkArgument(userId >= 0, "Invalid user id %d", userId); + enforceShellRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, userId); synchronized (mLock) { return stopUsersLU(userId, force, allowDelayedLocking, stopUserCallback, diff --git a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java index a49214f9b4f5..15b7cb576adc 100644 --- a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java @@ -645,6 +645,39 @@ public class UserControllerTest { /* keyEvictedCallback= */ mKeyEvictedCallback, /* expectLocking= */ true); } + @Test + public void testStopUser_invalidUser() { + int userId = -1; + + assertThrows(IllegalArgumentException.class, + () -> mUserController.stopUser(userId, /* force= */ true, + /* allowDelayedLocking= */ true, /* stopUserCallback= */ null, + /* keyEvictedCallback= */ null)); + } + + @Test + public void testStopUser_systemUser() { + int userId = UserHandle.USER_SYSTEM; + + int r = mUserController.stopUser(userId, /* force= */ true, + /* allowDelayedLocking= */ true, /* stopUserCallback= */ null, + /* keyEvictedCallback= */ null); + + assertThat(r).isEqualTo(ActivityManager.USER_OP_ERROR_IS_SYSTEM); + } + + @Test + public void testStopUser_currentUser() { + setUpUser(TEST_USER_ID1, /* flags= */ 0); + mUserController.startUser(TEST_USER_ID1, /* foreground= */ true); + + int r = mUserController.stopUser(TEST_USER_ID1, /* force= */ true, + /* allowDelayedLocking= */ true, /* stopUserCallback= */ null, + /* keyEvictedCallback= */ null); + + assertThat(r).isEqualTo(ActivityManager.USER_OP_IS_CURRENT); + } + /** * Test conditional delayed locking with mDelayUserDataLocking true. */ -- cgit v1.2.3-59-g8ed1b