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
This commit is contained in:
Ethan Lee
2022-11-29 02:22:06 +00:00
parent 8dadc7e871
commit eb90e9679d
2 changed files with 35 additions and 3 deletions

View File

@@ -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,

View File

@@ -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.
*/