Added user exist check in SystemService post-completed user event
Added an additional check to verify if the userId exists,
In case userId does not exist the method will return
without sending any post-completed user events.
Test: atest UserControllerTest
Test: atest SystemServiceManagerTest
Bug: 242226766
Change-Id: If5bb7420a91a60a7907aede4e140f47ea0ab10d6
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index 9455a89..1a8cf0b 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -121,7 +121,7 @@
* {@link #onUserSwitching(int, int)} as the previous user might have been removed already.
*/
@GuardedBy("mTargetUsers")
- private @Nullable TargetUser mCurrentUser;
+ @Nullable private TargetUser mCurrentUser;
SystemServiceManager(Context context) {
mContext = context;
@@ -335,13 +335,10 @@
mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
}
- private @NonNull TargetUser getTargetUser(@UserIdInt int userId) {
- final TargetUser targetUser;
+ @Nullable private TargetUser getTargetUser(@UserIdInt int userId) {
synchronized (mTargetUsers) {
- targetUser = mTargetUsers.get(userId);
+ return mTargetUsers.get(userId);
}
- Preconditions.checkState(targetUser != null, "No TargetUser for " + userId);
- return targetUser;
}
private @NonNull TargetUser newTargetUser(@UserIdInt int userId) {
@@ -400,6 +397,7 @@
prevUser = mCurrentUser;
}
curUser = mCurrentUser = getTargetUser(to);
+ Preconditions.checkState(curUser != null, "No TargetUser for " + to);
if (DEBUG) {
Slog.d(TAG, "Set mCurrentUser to " + mCurrentUser);
}
@@ -441,16 +439,25 @@
if (eventFlags == 0) {
return;
}
+
+ TargetUser targetUser = getTargetUser(userId);
+ if (targetUser == null) {
+ return;
+ }
+
onUser(TimingsTraceAndSlog.newAsyncLog(),
USER_COMPLETED_EVENT,
/* prevUser= */ null,
- getTargetUser(userId),
+ targetUser,
new UserCompletedEventType(eventFlags));
}
private void onUser(@NonNull String onWhat, @UserIdInt int userId) {
+ TargetUser targetUser = getTargetUser(userId);
+ Preconditions.checkState(targetUser != null, "No TargetUser for " + userId);
+
onUser(TimingsTraceAndSlog.newAsyncLog(), onWhat, /* prevUser= */ null,
- getTargetUser(userId));
+ targetUser);
}
private void onUser(@NonNull TimingsTraceAndSlog t, @NonNull String onWhat,
diff --git a/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java b/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java
index f92f5ea..3a592cd 100644
--- a/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java
@@ -81,4 +81,10 @@
assertEquals(1, counter.get());
}
+ @Test
+ public void onUserCompletedEventShouldNotThrowExceptionWithStoppedOrUnknownUser() {
+ mSystemServiceManager.onUserCompletedEvent(99,
+ SystemService.UserCompletedEventType.EVENT_TYPE_USER_STARTING);
+ }
+
}