Clear identity before calling out to PackageHelper

PackageHelper.resolveInstallLocation expects the binding user to be
equivalent to the calling user. If this is not the case, it may fail
and throw an exception preventing anyone but user 0 from installing
anything.

Bug: 17175251
Change-Id: Id5615738c7b4e1234a548c7b4a410282d14c9ee3
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 03cb2e9..5e802de 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -485,17 +485,22 @@
         if (params.mode == SessionParams.MODE_FULL_INSTALL) {
             // Brand new install, use best resolved location. This also verifies
             // that target has enough free space for the install.
-            final int resolved = PackageHelper.resolveInstallLocation(mContext,
-                    params.appPackageName, params.installLocation, params.sizeBytes,
-                    params.installFlags);
-            if (resolved == PackageHelper.RECOMMEND_INSTALL_INTERNAL) {
-                stageInternal = true;
-            } else if (resolved == PackageHelper.RECOMMEND_INSTALL_EXTERNAL) {
-                stageInternal = false;
-            } else {
-                throw new IOException("No storage with enough free space; res=" + resolved);
-            }
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                final int resolved = PackageHelper.resolveInstallLocation(mContext,
+                        params.appPackageName, params.installLocation, params.sizeBytes,
+                        params.installFlags);
 
+                if (resolved == PackageHelper.RECOMMEND_INSTALL_INTERNAL) {
+                    stageInternal = true;
+                } else if (resolved == PackageHelper.RECOMMEND_INSTALL_EXTERNAL) {
+                    stageInternal = false;
+                } else {
+                    throw new IOException("No storage with enough free space; res=" + resolved);
+                }
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
         } else if (params.mode == SessionParams.MODE_INHERIT_EXISTING) {
             // We always stage inheriting sessions on internal storage first,
             // since we don't want to grow containers until we're sure that