From f19eabddacc6fe463531652a22118d2670309678 Mon Sep 17 00:00:00 2001 From: Gavin Corkery Date: Fri, 27 Sep 2019 15:02:28 +0100 Subject: [PATCH 1/2] Add build fingerprint checks to APK sessions In order to prevent a staged install taking place after receiving an OTA, set the status of a staged session to failed if PackageManagerService.isDeviceUpgrading is true. Bug: 145840157 Test: atest StagedInstallTest#testInstallApkChangingFingerprint Change-Id: I7834bed49b2c7af80f2f07a937f9e15860c13910 Merged-In: I7834bed49b2c7af80f2f07a937f9e15860c13910 (cherry picked from commit de8174b3558953bc368bff618f9837a55f0e742c) --- .../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 0329e2c5ed45b..3ddddaa679d4e 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -259,6 +259,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements // Don't hold mSessions lock when calling restoreSession, since it might trigger an APK // atomic install which needs to query sessions, which requires lock on mSessions. for (PackageInstallerSession session : stagedSessionsToRestore) { + if (mPm.isDeviceUpgrading()) { + session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED, + "Build fingerprint has changed"); + } mStagingManager.restoreSession(session); } // Broadcasts are not sent while we restore sessions on boot, since no processes would be From d0ae5c22d5e6378ce3a6eb2211dfef39d6812105 Mon Sep 17 00:00:00 2001 From: Gavin Corkery Date: Tue, 22 Oct 2019 14:55:54 +0100 Subject: [PATCH 2/2] Don't mark terminal staged sessions as failed Currently we mark sessions in an already-terminal state (applied or failed) as failed when there is a build fingerprint change. This can cause issues with trying to clean a non-existent directory. Change this logic to check the status of the session when marking as failed. Test: atest StagedInstallTest Bug: 145840157 Change-Id: I163a3c6558117455038608e15065e076e2dd82d2 Merged-in: I163a3c6558117455038608e15065e076e2dd82d2 (cherry picked from commit 67ce22c57b51e7e41c667f51ad3de73cffbeb799) --- .../java/com/android/server/pm/PackageInstallerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 3ddddaa679d4e..fd8db4b99be85 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -259,7 +259,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements // Don't hold mSessions lock when calling restoreSession, since it might trigger an APK // atomic install which needs to query sessions, which requires lock on mSessions. for (PackageInstallerSession session : stagedSessionsToRestore) { - if (mPm.isDeviceUpgrading()) { + if (mPm.isDeviceUpgrading() && !session.isStagedAndInTerminalState()) { session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED, "Build fingerprint has changed"); }