From da7d72d88b9c45b4727deb100b92071b3f9a604e Mon Sep 17 00:00:00 2001 From: JW Wang Date: Fri, 18 Nov 2022 14:37:47 +0800 Subject: [PATCH] Prevent interleaved verification Committing a session twice in a row will result in interleaved verification flows and break the internal states. Add a field to prevent this from happening if the verification is already in progress. Bug: 256330705 Test: manual test Change-Id: I7e8a2fa7333d05a226268b325338e3fac69ddae0 --- .../android/server/pm/PackageInstallerSession.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 67b948f72d840..2e0022289f92a 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -380,6 +380,14 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { @GuardedBy("mLock") private boolean mStageDirInUse = false; + /** + * True if the verification is already in progress. This is used to prevent running + * verification again while one is already in progress which will break internal states. + * + * Worker thread only. + */ + private boolean mVerificationInProgress = false; + /** Permissions have been accepted by the user (see {@link #setPermissionsResult}) */ @GuardedBy("mLock") private boolean mPermissionsManuallyAccepted = false; @@ -2201,6 +2209,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { activate(); } + if (mVerificationInProgress) { + Slog.w(TAG, "Verification is already in progress for session " + sessionId); + return; + } + mVerificationInProgress = true; + if (params.isStaged) { mStagedSession.verifySession(); } else {