diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageInstallerSession.java | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index bc090f0aadda..91155252d75b 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -2734,23 +2734,27 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } - @Override - public void abandon() { - if (hasParentSessionId()) { - throw new IllegalStateException( - "Session " + sessionId + " is a child of multi-package session " - + getParentSessionId() + " and may not be abandoned directly."); + private void abandonNonStaged() { + synchronized (mLock) { + assertCallerIsOwnerOrRootLocked(); + if (mRelinquished) { + if (LOGD) Slog.d(TAG, "Ignoring abandon after commit relinquished control"); + return; + } + destroyInternal(); } + dispatchSessionFinished(INSTALL_FAILED_ABORTED, "Session was abandoned", null); + } + private void abandonStaged() { synchronized (mLock) { - if (params.isStaged && mDestroyed) { + if (mDestroyed) { // If a user abandons staged session in an unsafe state, then system will try to // abandon the destroyed staged session when it is safe on behalf of the user. assertCallerIsOwnerOrRootOrSystemLocked(); } else { assertCallerIsOwnerOrRootLocked(); } - if (isStagedAndInTerminalState()) { // We keep the session in the database if it's in a finalized state. It will be // removed by PackageInstallerService when the last update time is old enough. @@ -2758,7 +2762,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // do it now. return; } - if (mCommitted && params.isStaged) { + if (mCommitted) { mDestroyed = true; if (!mStagingManager.abortCommittedSessionLocked(this)) { // Do not clean up the staged session from system. It is not safe yet. @@ -2767,17 +2771,26 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } cleanStageDir(getChildSessionsLocked()); } - - if (mRelinquished) { - Slog.d(TAG, "Ignoring abandon after commit relinquished control"); - return; - } destroyInternal(); } dispatchSessionFinished(INSTALL_FAILED_ABORTED, "Session was abandoned", null); } @Override + public void abandon() { + if (hasParentSessionId()) { + throw new IllegalStateException( + "Session " + sessionId + " is a child of multi-package session " + + getParentSessionId() + " and may not be abandoned directly."); + } + if (params.isStaged) { + abandonStaged(); + } else { + abandonNonStaged(); + } + } + + @Override public boolean isMultiPackage() { return params.isMultiPackage; } |