From cd2466ee309bb4d2e88f52e688c0e0e9e5d49b58 Mon Sep 17 00:00:00 2001 From: Adam Bookatz Date: Mon, 2 May 2022 12:21:29 -0700 Subject: [PATCH] Ensure getUserName cannot return null A user can be created with an explicitly null name, as happens in tests. But getUserName claims to never return null. So we must do a null-check here to prevent it. Bug: 227624966 Test: atest UserManagerTest Change-Id: Iea0e7b6292c6dd49df1bebc5467091a82ddaedb5 --- core/api/test-current.txt | 2 +- core/java/android/content/pm/UserInfo.java | 3 ++- core/java/android/os/UserManager.java | 5 ++++- .../com/android/server/pm/UserManagerService.java | 11 ++++++++--- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 4681d49432566..d6a067d35f9b0 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -919,7 +919,7 @@ package android.content.pm { field public int id; field public String lastLoggedInFingerprint; field public long lastLoggedInTime; - field public String name; + field @Nullable public String name; field public boolean partial; field public boolean preCreated; field public int profileBadge; diff --git a/core/java/android/content/pm/UserInfo.java b/core/java/android/content/pm/UserInfo.java index 76e9fcb07f22b..d6e13ac90f828 100644 --- a/core/java/android/content/pm/UserInfo.java +++ b/core/java/android/content/pm/UserInfo.java @@ -18,6 +18,7 @@ package android.content.pm; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.TestApi; import android.annotation.UserIdInt; import android.compat.annotation.UnsupportedAppUsage; @@ -170,7 +171,7 @@ public class UserInfo implements Parcelable { @UnsupportedAppUsage public int serialNumber; @UnsupportedAppUsage - public String name; + public @Nullable String name; @UnsupportedAppUsage public String iconPath; @UnsupportedAppUsage diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index a64e63eacd564..196f2f94120e3 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -2179,7 +2179,10 @@ public class UserManager { } } else { UserInfo userInfo = getUserInfo(mUserId); - return userInfo == null ? "" : userInfo.name; + if (userInfo != null && userInfo.name != null) { + return userInfo.name; + } + return ""; } } diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 0dabff8370ba7..bcdf4291ed41a 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1430,6 +1430,8 @@ public class UserManagerService extends IUserManager.Stub { /** * Returns a UserInfo object with the name filled in, for Owner and Guest, or the original * if the name is already set. + * + * Note: Currently, the resulting name can be null if a user was truly created with a null name. */ private UserInfo userWithName(UserInfo orig) { if (orig != null && orig.name == null) { @@ -1638,7 +1640,7 @@ public class UserManagerService extends IUserManager.Stub { } @Override - public String getUserName() { + public @NonNull String getUserName() { final int callingUid = Binder.getCallingUid(); if (!hasQueryOrCreateUsersPermission() && !hasPermissionGranted( @@ -1649,7 +1651,10 @@ public class UserManagerService extends IUserManager.Stub { final int userId = UserHandle.getUserId(callingUid); synchronized (mUsersLock) { UserInfo userInfo = userWithName(getUserInfoLU(userId)); - return userInfo == null ? "" : userInfo.name; + if (userInfo != null && userInfo.name != null) { + return userInfo.name; + } + return ""; } } @@ -4165,7 +4170,7 @@ public class UserManagerService extends IUserManager.Stub { * @return the converted user, or {@code null} if no pre-created user could be converted. */ private @Nullable UserInfo convertPreCreatedUserIfPossible(String userType, - @UserInfoFlag int flags, String name, @Nullable Object token) { + @UserInfoFlag int flags, @Nullable String name, @Nullable Object token) { final UserData preCreatedUserData; synchronized (mUsersLock) { preCreatedUserData = getPreCreatedUserLU(userType);