From ce163ffca121406cf2a655ffa4c23e544409b20f Mon Sep 17 00:00:00 2001 From: Gavin Corkery Date: Thu, 9 Sep 2021 15:39:31 +0100 Subject: [PATCH] Only delete available rollbacks if packages are replaced This accounts for the case when an update is staged and the system server restarts. Previously, any rollbacks in the ENABLING state were deleted in this case since the current package versions would not match the "rolled back from" version in the rollback. This would mean that a rollback could be deleted even if the subsequent install was successful. Instead, skip the package version check for ENABLING rollbacks. Test: Stage install with rollback enabled, adb shell am restart, ensure the rollback is still in the enabling state Bug: 198006738 Change-Id: I70dfde95ccf0d6a5e20144e3de7f6c8afe55c13b --- .../android/server/rollback/RollbackManagerServiceImpl.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index a5646247f7665..e7b275643b662 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -654,15 +654,11 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba @WorkerThread private void onPackageReplaced(String packageName) { assertInWorkerThread(); - // TODO: Could this end up incorrectly deleting a rollback for a - // package that is about to be installed? long installedVersion = getInstalledPackageVersion(packageName); - Iterator iter = mRollbacks.iterator(); while (iter.hasNext()) { Rollback rollback = iter.next(); - // TODO: Should we remove rollbacks in the ENABLING state here? - if ((rollback.isEnabling() || rollback.isAvailable()) + if ((rollback.isAvailable()) && rollback.includesPackageWithDifferentVersion(packageName, installedVersion)) { iter.remove();