summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-12-06 08:10:49 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-12-06 08:10:49 +0000
commitd17175f6670b2454cdadb341a9cb383bfc2ca356 (patch)
tree06a228444896f687319db9aa35ee5df0bb346806
parent8b5b8a455fedd449d5c449bb7b5a2e6dfcc161e7 (diff)
parented587c1799ca6a4613a0b08533bbfc59c697f460 (diff)
Merge "Avoid NullPointerException" into main
-rw-r--r--services/core/java/com/android/server/pm/UserDataPreparer.java29
1 files changed, 18 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/pm/UserDataPreparer.java b/services/core/java/com/android/server/pm/UserDataPreparer.java
index 041f2d3a459d..04ce4e692fef 100644
--- a/services/core/java/com/android/server/pm/UserDataPreparer.java
+++ b/services/core/java/com/android/server/pm/UserDataPreparer.java
@@ -68,6 +68,10 @@ class UserDataPreparer {
void prepareUserData(UserInfo userInfo, int flags) {
try (PackageManagerTracedLock installLock = mInstallLock.acquireLock()) {
final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ if (storage == null) {
+ Log.e(TAG, "prepareUserData failed due to unable get StorageManager");
+ return;
+ }
/*
* Internal storage must be prepared before adoptable storage, since the user's volume
* keys are stored in their internal storage.
@@ -159,14 +163,16 @@ class UserDataPreparer {
void destroyUserData(int userId, int flags) {
try (PackageManagerTracedLock installLock = mInstallLock.acquireLock()) {
final StorageManager storage = mContext.getSystemService(StorageManager.class);
- /*
- * Volume destruction order isn't really important, but to avoid any weird issues we
- * process internal storage last, the opposite of prepareUserData.
- */
- for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
- final String volumeUuid = vol.getFsUuid();
- if (volumeUuid != null) {
- destroyUserDataLI(volumeUuid, userId, flags);
+ if (storage != null) {
+ /*
+ * Volume destruction order isn't really important, but to avoid any weird issues we
+ * process internal storage last, the opposite of prepareUserData.
+ */
+ for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
+ final String volumeUuid = vol.getFsUuid();
+ if (volumeUuid != null) {
+ destroyUserDataLI(volumeUuid, userId, flags);
+ }
}
}
destroyUserDataLI(null /* internal storage */, userId, flags);
@@ -194,9 +200,10 @@ class UserDataPreparer {
}
}
- // All the user's data directories should be empty now, so finish the job.
- storage.destroyUserStorage(volumeUuid, userId, flags);
-
+ if (storage != null) {
+ // All the user's data directories should be empty now, so finish the job.
+ storage.destroyUserStorage(volumeUuid, userId, flags);
+ }
} catch (Exception e) {
logCriticalInfo(Log.WARN,
"Failed to destroy user " + userId + " on volume " + volumeUuid + ": " + e);