From 0de6a7f5215041d9ce4d653f2154666cb4b3efd2 Mon Sep 17 00:00:00 2001 From: Chad Brubaker Date: Wed, 9 May 2018 14:05:57 -0700 Subject: [PATCH] Fall back to checking packages if one is not provided Test: atest GsmCdmaPhoneTest.java Change-Id: I81df49fd2f751ce28d834fc5d9cd254623930770 Fixes: 75450505 --- .../server/am/ActivityManagerService.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 58b40b1a5f6bd..bd13f98496815 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -20721,7 +20721,7 @@ public class ActivityManagerService extends IActivityManager.Stub // BROADCASTS // ========================================================= - private boolean isInstantApp(ProcessRecord record, String callerPackage, int uid) { + private boolean isInstantApp(ProcessRecord record, @Nullable String callerPackage, int uid) { if (UserHandle.getAppId(uid) < FIRST_APPLICATION_UID) { return false; } @@ -20730,13 +20730,17 @@ public class ActivityManagerService extends IActivityManager.Stub return record.info.isInstantApp(); } // Otherwise check with PackageManager. - if (callerPackage == null) { - Slog.e(TAG, "isInstantApp with an application's uid, no record, and no package name"); - throw new IllegalArgumentException("Calling application did not provide package name"); - } - mAppOpsService.checkPackage(uid, callerPackage); + IPackageManager pm = AppGlobals.getPackageManager(); try { - IPackageManager pm = AppGlobals.getPackageManager(); + if (callerPackage == null) { + final String[] packageNames = pm.getPackagesForUid(uid); + if (packageNames == null || packageNames.length == 0) { + throw new IllegalArgumentException("Unable to determine caller package name"); + } + // Instant Apps can't use shared uids, so its safe to only check the first package. + callerPackage = packageNames[0]; + } + mAppOpsService.checkPackage(uid, callerPackage); return pm.isInstantApp(callerPackage, UserHandle.getUserId(uid)); } catch (RemoteException e) { Slog.e(TAG, "Error looking up if " + callerPackage + " is an instant app.", e);