summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2020-12-07 13:40:52 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-12-07 13:40:52 +0000
commitb467f2237e6bb76f16e50e9cfd3f8cc3a28eae51 (patch)
treec11f0b2111af06501c9891e39ef0050c3e4734a9
parentfd8de2082e980f9164b577bd8798cd05a297ab0b (diff)
parent16636b7044fdc8410ab232ed4efcba6e3c86b9ab (diff)
Merge changes from topic "fail-validation-q" into qt-qpr1-dev
* changes: Delete orphaned staging directories for staged session on reboot Clean up staged session data on validation failure
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java4
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java6
2 files changed, 10 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 6a47c4c544e8..a013f050ff98 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -287,6 +287,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
final ArraySet<File> unclaimedStages = newArraySet(
stagingDir.listFiles(sStageFilter));
+ // We also need to clean up orphaned staging directory for staged sessions
+ final File stagedSessionStagingDir = Environment.getDataStagingDirectory(volumeUuid);
+ unclaimedStages.addAll(newArraySet(stagedSessionStagingDir.listFiles()));
+
// Ignore stages claimed by active sessions
for (int i = 0; i < mSessions.size(); i++) {
final PackageInstallerSession session = mSessions.valueAt(i);
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 1976ffd7a7bf..5d4c7d57fdff 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -881,6 +881,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
+ mParentSessionId + " and may not be committed directly.");
}
if (!markAsCommitted(statusReceiver, forTransfer)) {
+ if (isStaged()) {
+ // cleanStageDir calls mSessionProvider to get hold of child sessions, which in turn
+ // needs PackageInstallerService#mSessions lock. So we should not call cleanStageDir
+ // while holding mLock to avoid lock inversion.
+ cleanStageDir();
+ }
return;
}
if (isMultiPackage()) {