diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 76f7d64bbfaaf..9981b909d2e48 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5646,9 +5646,11 @@ public class PackageManagerService extends IPackageManager.Stub private int checkUidPermissionImpl(String permName, int uid) { synchronized (mPackages) { final String[] packageNames = getPackagesForUid(uid); - final PackageParser.Package pkg = (packageNames != null && packageNames.length > 0) - ? mPackages.get(packageNames[0]) - : null; + PackageParser.Package pkg = null; + final int N = packageNames == null ? 0 : packageNames.length; + for (int i = 0; pkg == null && i < N; i++) { + pkg = mPackages.get(packageNames[i]); + } // Additional logs for b/111075456; ignore system UIDs if (pkg == null && UserHandle.getAppId(uid) >= Process.FIRST_APPLICATION_UID) { if (packageNames == null || packageNames.length < 2) { @@ -6385,6 +6387,16 @@ public class PackageManagerService extends IPackageManager.Stub } } + /** + * IMPORTANT: Not all packages returned by this method may be known + * to the system. There are two conditions in which this may occur: + *
    + *
  1. The package is on adoptable storage and the device has been removed
  2. + *
  3. The package is being removed and the internal structures are partially updated
  4. + *
+ * The second is an artifact of the current data structures and should be fixed. See + * b/111075456 for one such instance. + */ @Override public String[] getPackagesForUid(int uid) { return getPackagesForUid_debug(uid, false);