Merge "Ignore abandon after install relinquished." into mnc-dev
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 89ca00e..dcf668d 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -127,6 +127,8 @@
     @GuardedBy("mLock")
     private boolean mPermissionsAccepted = false;
     @GuardedBy("mLock")
+    private boolean mRelinquished = false;
+    @GuardedBy("mLock")
     private boolean mDestroyed = false;
 
     private int mFinalStatus;
@@ -557,6 +559,7 @@
             user = new UserHandle(userId);
         }
 
+        mRelinquished = true;
         mPm.installStage(mPackageName, stageDir, stageCid, localObserver, params,
                 installerPackageName, installerUid, user);
     }
@@ -928,6 +931,10 @@
 
     @Override
     public void abandon() {
+        if (mRelinquished) {
+            Slog.d(TAG, "Ignoring abandon after commit relinquished control");
+            return;
+        }
         destroyInternal();
         dispatchSessionFinished(INSTALL_FAILED_ABORTED, "Session was abandoned", null);
     }
@@ -958,8 +965,7 @@
             }
         }
         if (stageDir != null) {
-            FileUtils.deleteContents(stageDir);
-            stageDir.delete();
+            mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath());
         }
         if (stageCid != null) {
             PackageHelper.destroySdDir(stageCid);
@@ -990,6 +996,7 @@
         pw.printPair("mProgress", mProgress);
         pw.printPair("mSealed", mSealed);
         pw.printPair("mPermissionsAccepted", mPermissionsAccepted);
+        pw.printPair("mRelinquished", mRelinquished);
         pw.printPair("mDestroyed", mDestroyed);
         pw.printPair("mBridges", mBridges.size());
         pw.printPair("mFinalStatus", mFinalStatus);