OSDN Git Service

RollbackManager: fix installedUsers null pointer exception.
authorRichard Uhler <ruhler@google.com>
Mon, 18 Feb 2019 11:33:03 +0000 (11:33 +0000)
committerRichard Uhler <ruhler@google.com>
Mon, 18 Feb 2019 11:52:13 +0000 (11:52 +0000)
The installedUsers argument is passed as null to
enableRollbackForSession in the pre-reboot case of staged installs, but
the code assumes it is non-null. Pass an empty array instead and ensure
the installedUsers is properly updated post-reboot.

Bug: 124284714
Test: atest StagedRollbackTest (currently under development)
Change-Id: I4ccd19ca289fd127f77c070c0ad0e2873a4e692a

services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java

index ceaf829..05d3c17 100644 (file)
@@ -16,6 +16,7 @@
 
 package com.android.server.rollback;
 
+import android.annotation.NonNull;
 import android.app.AppOpsManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -842,6 +843,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
             String packageName = newPackage.packageName;
             for (PackageRollbackInfo info : rd.packages) {
                 if (info.getPackageName().equals(packageName)) {
+                    info.getInstalledUsers().addAll(IntArray.wrap(installedUsers));
                     AppDataRollbackHelper.SnapshotAppDataResult rs =
                             mAppDataRollbackHelper.snapshotAppData(packageName, installedUsers);
                     info.getPendingBackups().addAll(rs.pendingBackups);
@@ -874,7 +876,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
      * the child sessions, not the parent session.
      */
     private boolean enableRollbackForSession(PackageInstaller.SessionInfo session,
-            int[] installedUsers, boolean snapshotUserData) {
+            @NonNull int[] installedUsers, boolean snapshotUserData) {
         // TODO: Don't attempt to enable rollback for split installs.
         final int installFlags = session.installFlags;
         if ((installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) == 0) {
@@ -1016,7 +1018,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
             }
 
             if (!session.isMultiPackage()) {
-                if (!enableRollbackForSession(session, null, false)) {
+                if (!enableRollbackForSession(session, new int[0], false)) {
                     Log.e(TAG, "Unable to enable rollback for session: " + sessionId);
                     result.offer(false);
                     return;
@@ -1030,7 +1032,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
                         result.offer(false);
                         return;
                     }
-                    if (!enableRollbackForSession(childSession, null, false)) {
+                    if (!enableRollbackForSession(childSession, new int[0], false)) {
                         Log.e(TAG, "Unable to enable rollback for session: " + sessionId);
                         result.offer(false);
                         return;