From 2e968c80766241f7719ac4f7375c12fe0047f10b 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 Merged-In: I7e8a2fa7333d05a226268b325338e3fac69ddae0 (cherry picked from commit da7d72d88b9c45b4727deb100b92071b3f9a604e) --- .../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 37bfbb11948a8..7c2e3ea426b4f 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -366,6 +366,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; @@ -2136,6 +2144,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return; } + if (mVerificationInProgress) { + Slog.w(TAG, "Verification is already in progress for session " + sessionId); + return; + } + mVerificationInProgress = true; + if (params.isStaged) { mStagedSession.verifySession(); } else {