From 04bdf998e42e9896ee823e84ab5d4293d298328e Mon Sep 17 00:00:00 2001 From: JW Wang Date: Tue, 5 Oct 2021 16:07:02 +0800 Subject: [PATCH 1/3] Early detection of mis-configuration (1/n) Move the check to addChildSessionId() to reject the error as early as possible. Bug: 203026561 Test: will be added to CtsAtomicInstallTestCases Change-Id: I30a6161d8ae5a15c270793c80280247b5ae55fa5 --- .../android/server/pm/PackageInstallerSession.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 020c23d902be9..38059772cfd1a 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -2406,13 +2406,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { final VerificationParams verifyingSession = prepareForVerification(); if (isMultiPackage()) { final List childSessions = getChildSessions(); - // Spot check to reject a non-staged multi package install of APEXes and APKs. - if (!params.isStaged && containsApkSession() - && sessionContains(s -> s.isApexSession())) { - throw new PackageManagerException( - PackageManager.INSTALL_FAILED_SESSION_INVALID, - "Non-staged multi package install of APEX and APK packages is not supported"); - } List verifyingChildSessions = new ArrayList<>(childSessions.size()); boolean success = true; @@ -4172,6 +4165,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { + childSession.sessionId + " and session " + sessionId + " have inconsistent rollback settings"); } + boolean hasAPK = containsApkSession() || !childSession.isApexSession(); + boolean hasAPEX = sessionContains(s -> s.isApexSession()) || childSession.isApexSession(); + if (!params.isStaged && hasAPK && hasAPEX) { + throw new IllegalStateException("Mix of APK and APEX is not supported for " + + "non-staged multi-package session"); + } try { acquireTransactionLock(); From 40e746c787b997c5c531bd59552de3efaf9176a5 Mon Sep 17 00:00:00 2001 From: JW Wang Date: Tue, 5 Oct 2021 17:06:55 +0800 Subject: [PATCH 2/3] Remove redundant parameter (2/n) No need to pass currentStatus which always equals child.mRet inside trySendVerificationCompleteNotification(). Bug: 203026561 Test: m Change-Id: Id368073187fbb7590599355cf994a3c39068c561 --- .../android/server/pm/VerificationParams.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/pm/VerificationParams.java b/services/core/java/com/android/server/pm/VerificationParams.java index 3d2ffe1b868e9..ed15e6931fead 100644 --- a/services/core/java/com/android/server/pm/VerificationParams.java +++ b/services/core/java/com/android/server/pm/VerificationParams.java @@ -65,7 +65,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.provider.DeviceConfig; import android.provider.Settings; -import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Pair; import android.util.Slog; @@ -78,7 +78,7 @@ import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; +import java.util.Set; final class VerificationParams extends HandlerParams { /** @@ -688,7 +688,7 @@ final class VerificationParams extends HandlerParams { private void sendVerificationCompleteNotification() { if (mParentVerificationParams != null) { - mParentVerificationParams.trySendVerificationCompleteNotification(this, mRet); + mParentVerificationParams.trySendVerificationCompleteNotification(this); } else { try { mObserver.onPackageInstalled(null, mRet, mErrorMessage, @@ -717,7 +717,7 @@ final class VerificationParams extends HandlerParams { static final class MultiPackageVerificationParams extends HandlerParams { private final IPackageInstallObserver2 mObserver; private final List mChildParams; - private final Map mVerificationState; + private final Set mVerificationState; MultiPackageVerificationParams(VerificationParams parent, List children, PackageManagerService pm) throws PackageManagerException { @@ -731,7 +731,7 @@ final class VerificationParams extends HandlerParams { final VerificationParams childParams = children.get(i); childParams.mParentVerificationParams = this; } - mVerificationState = new ArrayMap<>(mChildParams.size()); + mVerificationState = new ArraySet<>(mChildParams.size()); mObserver = parent.mObserver; } @@ -749,14 +749,14 @@ final class VerificationParams extends HandlerParams { } } - void trySendVerificationCompleteNotification(VerificationParams child, int currentStatus) { - mVerificationState.put(child, currentStatus); + void trySendVerificationCompleteNotification(VerificationParams child) { + mVerificationState.add(child); if (mVerificationState.size() != mChildParams.size()) { return; } int completeStatus = PackageManager.INSTALL_SUCCEEDED; String errorMsg = null; - for (VerificationParams params : mVerificationState.keySet()) { + for (VerificationParams params : mVerificationState) { int status = params.mRet; if (status == PackageManager.INSTALL_UNKNOWN) { return; From 4e73aea7189a61105d7cd3cef4826302c553802b Mon Sep 17 00:00:00 2001 From: JW Wang Date: Tue, 5 Oct 2021 17:27:33 +0800 Subject: [PATCH 3/3] Remove the PackageManager.INSTALL_UNKNOWN check (3/n) Though unlikely, the notification will never be sent and the install process will stuck forever if one of params.mRet equlas PackageManager.INSTALL_UNKNOWN. We should just treat PackageManager.INSTALL_UNKNOWN as failure. Bug: 203026561 Test: atest CtsStagedInstallHostTestCases Change-Id: Ib7070ce89a667bf8a5ab2ceed6b0cc4c7fac44c9 --- .../core/java/com/android/server/pm/VerificationParams.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/VerificationParams.java b/services/core/java/com/android/server/pm/VerificationParams.java index ed15e6931fead..c5569cd53da10 100644 --- a/services/core/java/com/android/server/pm/VerificationParams.java +++ b/services/core/java/com/android/server/pm/VerificationParams.java @@ -758,9 +758,7 @@ final class VerificationParams extends HandlerParams { String errorMsg = null; for (VerificationParams params : mVerificationState) { int status = params.mRet; - if (status == PackageManager.INSTALL_UNKNOWN) { - return; - } else if (status != PackageManager.INSTALL_SUCCEEDED) { + if (status != PackageManager.INSTALL_SUCCEEDED) { completeStatus = status; errorMsg = params.mErrorMessage; break;