summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java41
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;
}