summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2022-09-07 04:23:04 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-09-07 04:23:04 +0000
commit1d9daf50c38bf9570f433ce952a2136210645d83 (patch)
tree1c198f1ceff883d26040cae0f618fe4ce1495957
parent1809ffcf0e1e06995baa38d98b9e1dcf7fc7edc0 (diff)
parent0ad4f80cbb5b2713106752c11c07e7c842647cd5 (diff)
Merge "Added check for user info is not null" into tm-qpr-dev
-rw-r--r--core/java/android/content/Intent.java35
-rw-r--r--services/core/java/com/android/server/VpnManagerService.java18
2 files changed, 51 insertions, 2 deletions
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 7a88a057fb77..5ca8b0535dce 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -3920,6 +3920,12 @@ public class Intent implements Parcelable, Cloneable {
* that has been started. This is sent as a foreground
* broadcast, since it is part of a visible user interaction; be as quick
* as possible when handling it.
+ *
+ * <p>
+ * <b>Note:</b> The user's actual state might have changed by the time the broadcast is
+ * received. For example, the user could have been removed, started or stopped already,
+ * regardless of which broadcast you receive. Because of that, receivers should always check
+ * the current state of the user.
* @hide
*/
public static final String ACTION_USER_STARTED =
@@ -3937,6 +3943,12 @@ public class Intent implements Parcelable, Cloneable {
* {@link #ACTION_USER_STOPPING}. It is <b>not</b> generally safe to use with
* other user state broadcasts since those are foreground broadcasts so can
* execute in a different order.
+ *
+ * <p>
+ * <b>Note:</b> The user's actual state might have changed by the time the broadcast is
+ * received. For example, the user could have been removed, started or stopped already,
+ * regardless of which broadcast you receive. Because of that, receivers should always check
+ * the current state of the user.
* @hide
*/
public static final String ACTION_USER_STARTING =
@@ -3955,6 +3967,11 @@ public class Intent implements Parcelable, Cloneable {
* {@link #ACTION_USER_STARTING}. It is <b>not</b> generally safe to use with
* other user state broadcasts since those are foreground broadcasts so can
* execute in a different order.
+ * <p>
+ * <b>Note:</b> The user's actual state might have changed by the time the broadcast is
+ * received. For example, the user could have been removed, started or stopped already,
+ * regardless of which broadcast you receive. Because of that, receivers should always check
+ * the current state of the user.
* @hide
*/
public static final String ACTION_USER_STOPPING =
@@ -3967,6 +3984,12 @@ public class Intent implements Parcelable, Cloneable {
* specific package. This is only sent to registered receivers, not manifest
* receivers. It is sent to all running users <em>except</em> the one that
* has just been stopped (which is no longer running).
+ *
+ * <p>
+ * <b>Note:</b> The user's actual state might have changed by the time the broadcast is
+ * received. For example, the user could have been removed, started or stopped already,
+ * regardless of which broadcast you receive. Because of that, receivers should always check
+ * the current state of the user.
* @hide
*/
@TestApi
@@ -3999,6 +4022,12 @@ public class Intent implements Parcelable, Cloneable {
* It is sent to all running users.
* You must hold
* {@link android.Manifest.permission#MANAGE_USERS} to receive this broadcast.
+ *
+ * <p>
+ * <b>Note:</b> The user's actual state might have changed by the time the broadcast is
+ * received. For example, the user could have been removed, started or stopped already,
+ * regardless of which broadcast you receive. Because of that, receivers should always check
+ * the current state of the user.
* @hide
*/
@SystemApi
@@ -4009,6 +4038,12 @@ public class Intent implements Parcelable, Cloneable {
* Broadcast Action: Sent when the credential-encrypted private storage has
* become unlocked for the target user. This is only sent to registered
* receivers, not manifest receivers.
+ *
+ * <p>
+ * <b>Note:</b> The user's actual state might have changed by the time the broadcast is
+ * received. For example, the user could have been removed, started or stopped already,
+ * regardless of which broadcast you receive. Because of that, receivers should always check
+ * the current state of the user.
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_USER_UNLOCKED = "android.intent.action.USER_UNLOCKED";
diff --git a/services/core/java/com/android/server/VpnManagerService.java b/services/core/java/com/android/server/VpnManagerService.java
index 07b6843b2feb..7cb2fd0f37af 100644
--- a/services/core/java/com/android/server/VpnManagerService.java
+++ b/services/core/java/com/android/server/VpnManagerService.java
@@ -28,6 +28,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.UserInfo;
import android.net.ConnectivityManager;
import android.net.INetd;
import android.net.IVpnManager;
@@ -771,6 +772,12 @@ public class VpnManagerService extends IVpnManager.Stub {
@VisibleForTesting
void onUserStarted(int userId) {
+ UserInfo user = mUserManager.getUserInfo(userId);
+ if (user == null) {
+ logw("Started user doesn't exist. UserId: " + userId);
+ return;
+ }
+
synchronized (mVpns) {
Vpn userVpn = mVpns.get(userId);
if (userVpn != null) {
@@ -779,7 +786,8 @@ public class VpnManagerService extends IVpnManager.Stub {
}
userVpn = mDeps.createVpn(mHandler.getLooper(), mContext, mNMS, mNetd, userId);
mVpns.put(userId, userVpn);
- if (mUserManager.getUserInfo(userId).isPrimary() && isLockdownVpnEnabled()) {
+
+ if (user.isPrimary() && isLockdownVpnEnabled()) {
updateLockdownVpn();
}
}
@@ -896,9 +904,15 @@ public class VpnManagerService extends IVpnManager.Stub {
}
private void onUserUnlocked(int userId) {
+ UserInfo user = mUserManager.getUserInfo(userId);
+ if (user == null) {
+ logw("Unlocked user doesn't exist. UserId: " + userId);
+ return;
+ }
+
synchronized (mVpns) {
// User present may be sent because of an unlock, which might mean an unlocked keystore.
- if (mUserManager.getUserInfo(userId).isPrimary() && isLockdownVpnEnabled()) {
+ if (user.isPrimary() && isLockdownVpnEnabled()) {
updateLockdownVpn();
} else {
startAlwaysOnVpn(userId);