From e812d9096915ad165de125520ed7371009587d1f Mon Sep 17 00:00:00 2001 From: Robin Lee Date: Thu, 21 Aug 2014 16:51:18 +0100 Subject: 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 --- .../android/server/pm/PackageInstallerService.java | 25 +++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'services') 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 @@ public class PackageInstallerService extends IPackageInstaller.Stub { 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 -- cgit v1.1