diff options
| author | 2019-03-13 18:06:24 +0000 | |
|---|---|---|
| committer | 2019-03-13 18:06:24 +0000 | |
| commit | 47799f4029f383973b82d0ce3a7310abc037fcc6 (patch) | |
| tree | fcb71def98851bbaf08bf4d6ecb91f6728814298 | |
| parent | b113a8a06bace56bebb5e489a138d5d9d9ac4f82 (diff) | |
Don't resume uncommitted sessions.
The "isCommitted" bit wasn't previously carried over since before staged
install a session successfully commited was promptly destroyed.
Checkpoint also the commit status and carry it over.
Fix: 128432016
Test: reproduced the bug with a hack on StagedRollbackTest and verified
it doesn't trigger anynmore after the change.
Change-Id: I948fd3d964800621f5d5f5019621839383d6b486
4 files changed, 15 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 3a4bcca46966..ad51e357e2d7 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -589,7 +589,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements          session = new PackageInstallerSession(mInternalCallback, mContext, mPm, this,                  mInstallThread.getLooper(), mStagingManager, sessionId, userId,                  installerPackageName, callingUid, params, createdMillis, stageDir, stageCid, false, -                false, null, SessionInfo.INVALID_ID, false, false, false, +                false, false, null, SessionInfo.INVALID_ID, false, false, false,                  SessionInfo.STAGED_SESSION_NO_ERROR, "");          synchronized (mSessions) { diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 2de50e2a0c4e..81c0a974993b 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -145,6 +145,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {      private static final String ATTR_SESSION_STAGE_DIR = "sessionStageDir";      private static final String ATTR_SESSION_STAGE_CID = "sessionStageCid";      private static final String ATTR_PREPARED = "prepared"; +    private static final String ATTR_COMMITTED = "committed";      private static final String ATTR_SEALED = "sealed";      private static final String ATTR_MULTI_PACKAGE = "multiPackage";      private static final String ATTR_PARENT_SESSION_ID = "parentSessionId"; @@ -401,7 +402,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {              PackageSessionProvider sessionProvider, Looper looper, StagingManager stagingManager,              int sessionId, int userId,              String installerPackageName, int installerUid, SessionParams params, long createdMillis, -            File stageDir, String stageCid, boolean prepared, boolean sealed, +            File stageDir, String stageCid, boolean prepared, boolean committed, boolean sealed,              @Nullable int[] childSessionIds, int parentSessionId, boolean isReady,              boolean isFailed, boolean isApplied, int stagedSessionErrorCode,              String stagedSessionErrorMessage) { @@ -434,6 +435,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {          }          mPrepared = prepared; +        mCommitted = committed;          mStagedSessionReady = isReady;          mStagedSessionFailed = isFailed;          mStagedSessionApplied = isApplied; @@ -2156,6 +2158,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {          pw.printPair("mClientProgress", mClientProgress);          pw.printPair("mProgress", mProgress); +        pw.printPair("mCommitted", mCommitted);          pw.printPair("mSealed", mSealed);          pw.printPair("mPermissionsManuallyAccepted", mPermissionsManuallyAccepted);          pw.printPair("mRelinquished", mRelinquished); @@ -2214,6 +2217,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {                  writeStringAttribute(out, ATTR_SESSION_STAGE_CID, stageCid);              }              writeBooleanAttribute(out, ATTR_PREPARED, isPrepared()); +            writeBooleanAttribute(out, ATTR_COMMITTED, isCommitted());              writeBooleanAttribute(out, ATTR_SEALED, isSealed());              writeBooleanAttribute(out, ATTR_MULTI_PACKAGE, params.isMultiPackage); @@ -2311,6 +2315,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {          final File stageDir = (stageDirRaw != null) ? new File(stageDirRaw) : null;          final String stageCid = readStringAttribute(in, ATTR_SESSION_STAGE_CID);          final boolean prepared = readBooleanAttribute(in, ATTR_PREPARED, true); +        final boolean committed = readBooleanAttribute(in, ATTR_COMMITTED);          final boolean sealed = readBooleanAttribute(in, ATTR_SEALED);          final int parentSessionId = readIntAttribute(in, ATTR_PARENT_SESSION_ID,                  SessionInfo.INVALID_ID); @@ -2387,8 +2392,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {          return new PackageInstallerSession(callback, context, pm, sessionProvider,                  installerThread, stagingManager, sessionId, userId, installerPackageName, -                installerUid, params, createdMillis, stageDir, stageCid, prepared, sealed, -                childSessionIdsArray, parentSessionId, isReady, isFailed, isApplied, +                installerUid, params, createdMillis, stageDir, stageCid, prepared, committed, +                sealed, childSessionIdsArray, parentSessionId, isReady, isFailed, isApplied,                  stagedSessionErrorCode, stagedSessionErrorMessage);      } diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 088146d2d658..621b34596f28 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -606,6 +606,10 @@ public class StagingManager {      }      private void checkStateAndResume(@NonNull PackageInstallerSession session) { +        if (!session.isCommitted()) { +            // Session hasn't been committed yet, ignore. +            return; +        }          // Check the state of the session and decide what to do next.          if (session.isStagedSessionFailed() || session.isStagedSessionApplied()) {              // Final states, nothing to do. diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java index 26722fd64b4a..d3f33a152734 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java @@ -167,6 +167,7 @@ public class PackageInstallerSessionTest {                  /* stageDir */ mTmpDir,                  /* stageCid */ null,                  /* prepared */ true, +                /* committed */ true,                  /* sealed */ false,  // Setting to true would trigger some PM logic.                  /* childSessionIds */ childSessionIds != null ? childSessionIds : new int[0],                  /* parentSessionId */ parentSessionId, @@ -300,6 +301,7 @@ public class PackageInstallerSessionTest {          assertEquals(expected.getStagedSessionErrorMessage(),                  actual.getStagedSessionErrorMessage());          assertEquals(expected.isPrepared(), actual.isPrepared()); +        assertEquals(expected.isCommitted(), actual.isCommitted());          assertEquals(expected.isSealed(), actual.isSealed());          assertEquals(expected.isMultiPackage(), actual.isMultiPackage());          assertEquals(expected.hasParentSessionId(), actual.hasParentSessionId());  |