From 58432ac699e1869f4f4aa9745a48c96e22e18aaa Mon Sep 17 00:00:00 2001 From: Mohammad Samiul Islam Date: Fri, 13 Nov 2020 17:32:05 +0000 Subject: [PATCH 1/2] Clean up staged session data on validation failure Bug: 173132101 Test: manual test using `adb install --staged foo.apk` multiple times Test: manual test using `adb install-multi-package --staged foo.apk bar.apk` Change-Id: Idd6597cd0d2dda34a8a7626b585401eeee39c31f Merged-In: Idd6597cd0d2dda34a8a7626b585401eeee39c31f (cherry picked from commit f54412183a19916f6ce704f113967b8b19ef6ed8) --- .../java/com/android/server/pm/PackageInstallerSession.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 1976ffd7a7bfe..5d4c7d57fdff1 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()) { From 16636b7044fdc8410ab232ed4efcba6e3c86b9ab Mon Sep 17 00:00:00 2001 From: Mohammad Samiul Islam Date: Fri, 13 Nov 2020 19:08:31 +0000 Subject: [PATCH 2/2] Delete orphaned staging directories for staged session on reboot Bug: 173132101 Test: manually created folders in /data/app-staging and observed they were deleted on reboot Change-Id: If840f35245c2d049401d0d2f6539fe8c4625151e Merged-In: If840f35245c2d049401d0d2f6539fe8c4625151e (cherry picked from commit bfbf9608015ba6ff740639625b9a3ea26db60b76) --- .../java/com/android/server/pm/PackageInstallerService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 6a47c4c544e84..a013f050ff987 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 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);