Prevent committing session while in progress

Committing a session twice in a row will result in interleaved
verification flows and break the internal states.

Add a field to prevent committing again while the installation
is already in progress.

Bug: 256330705
Test: presubmit
Change-Id: I1f5a90acde1874b3efbe4dad55f366e991bb4a21
Merged-In: I1f5a90acde1874b3efbe4dad55f366e991bb4a21
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 37bfbb1..06458d1 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 @@
     @GuardedBy("mLock")
     private boolean mStageDirInUse = false;
 
+    /**
+     * True if the installation is already in progress. This is used to prevent the caller
+     * from {@link #commit(IntentSender, boolean) committing} the session again while the
+     * installation is still in progress.
+     */
+    @GuardedBy("mLock")
+    private boolean mInstallationInProgress = false;
+
     /** Permissions have been accepted by the user (see {@link #setPermissionsResult}) */
     @GuardedBy("mLock")
     private boolean mPermissionsManuallyAccepted = false;
@@ -1661,6 +1669,14 @@
             }
         }
 
+        synchronized (mLock) {
+            if (mInstallationInProgress) {
+                throw new IllegalStateException("Installation is already in progress. Don't "
+                        + "commit session=" + sessionId + " again.");
+            }
+            mInstallationInProgress = true;
+        }
+
         dispatchSessionSealed();
     }