diff options
4 files changed, 54 insertions, 9 deletions
| diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index acceed05943c..7fc9a69a1f92 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -285,7 +285,8 @@ public class ApplicationPackageManager extends PackageManager {      public PermissionInfo getPermissionInfo(String name, int flags)              throws NameNotFoundException {          try { -            PermissionInfo pi = mPM.getPermissionInfo(name, flags); +            PermissionInfo pi = mPM.getPermissionInfo(name, +                    mContext.getOpPackageName(), flags);              if (pi != null) {                  return pi;              } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 9b795aa58a26..64d687e9d3de 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -72,7 +72,7 @@ interface IPackageManager {      String[] currentToCanonicalPackageNames(in String[] names);      String[] canonicalToCurrentPackageNames(in String[] names); -    PermissionInfo getPermissionInfo(String name, int flags); +    PermissionInfo getPermissionInfo(String name, String packageName, int flags);      ParceledListSlice queryPermissionsByGroup(String group, int flags); diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 739497b771aa..7c7eda7a3efe 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -802,7 +802,7 @@ public final class BroadcastQueue {          IPackageManager pm = AppGlobals.getPackageManager();          for (int i = perms.length-1; i >= 0; i--) {              try { -                PermissionInfo pi = pm.getPermissionInfo(perms[i], 0); +                PermissionInfo pi = pm.getPermissionInfo(perms[i], "android", 0);                  if ((pi.protectionLevel & (PermissionInfo.PROTECTION_MASK_BASE                          | PermissionInfo.PROTECTION_FLAG_PRIVILEGED))                          != PermissionInfo.PROTECTION_SIGNATURE) { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index b74f1832b8fa..66e6f5e91500 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4223,18 +4223,62 @@ public class PackageManagerService extends IPackageManager.Stub      }      @Override -    public PermissionInfo getPermissionInfo(String name, int flags) { -        if (getInstantAppPackageName(Binder.getCallingUid()) != null) { +    public PermissionInfo getPermissionInfo(String name, String packageName, int flags) { +        final int callingUid = Binder.getCallingUid(); +        if (getInstantAppPackageName(callingUid) != null) {              return null;          }          // reader          synchronized (mPackages) {              final BasePermission p = mSettings.mPermissions.get(name); -            if (p != null) { -                return generatePermissionInfo(p, flags); -            } -            return null; +            // If the caller is an app that targets pre 26 SDK drop protection flags. +            final PermissionInfo permissionInfo = generatePermissionInfo(p, flags); +            permissionInfo.protectionLevel = adjustPermissionProtectionFlagsLPr( +                    permissionInfo.protectionLevel, packageName, callingUid); +            return permissionInfo; +        } +    } + +    private int adjustPermissionProtectionFlagsLPr(int protectionLevel, +            String packageName, int uid) { +        // Signature permission flags area always reported +        final int protectionLevelMasked = protectionLevel +                & (PermissionInfo.PROTECTION_NORMAL +                | PermissionInfo.PROTECTION_DANGEROUS +                | PermissionInfo.PROTECTION_SIGNATURE); +        if (protectionLevelMasked == PermissionInfo.PROTECTION_SIGNATURE) { +            return protectionLevel; +        } + +        // System sees all flags. +        final int appId = UserHandle.getAppId(uid); +        if (appId == Process.SYSTEM_UID || appId == Process.ROOT_UID +                || appId == Process.SHELL_UID) { +            return protectionLevel;          } + +        // Normalize package name to handle renamed packages and static libs +        packageName = resolveInternalPackageNameLPr(packageName, +                PackageManager.VERSION_CODE_HIGHEST); + +        // Apps that target O see flags for all protection levels. +        final PackageSetting ps = mSettings.mPackages.get(packageName); +        if (ps == null) { +            return protectionLevel; +        } +        if (ps.appId != appId) { +            return protectionLevel; +        } + +        final PackageParser.Package pkg = mPackages.get(packageName); +        if (pkg == null) { +            return protectionLevel; +        } +        if (pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.O) { +            return protectionLevelMasked; +        } + +        return protectionLevel;      }      @Override |