Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3c71449d authored by Todd Kennedy's avatar Todd Kennedy
Browse files

Send package to permission check

While splitting the permissions from the package manager service,
we adjusted the implementation of checkUidPermission() which queried
for package objects separately from obtaining the package names
belonging to a UID. This caused some subtle timing issue where the
package object sometimes failed to be present.

Instead, send the affected package while in a sycnhronized block
to avoid the timing issue.

Fixes: 68260103
Test: Manual
Change-Id: I0b0e124ffd12a31569a1ed0d8a6a7b82cf824d63
parent b97eb6b8
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -5216,7 +5216,13 @@ Slog.e("TODD",
    @Override
    public int checkUidPermission(String permName, int uid) {
        return mPermissionManager.checkUidPermission(permName, uid, getCallingUid());
        synchronized (mPackages) {
            final String[] packageNames = getPackagesForUid(uid);
            final PackageParser.Package pkg = (packageNames != null && packageNames.length > 0)
                    ? mPackages.get(packageNames[0])
                    : null;
            return mPermissionManager.checkUidPermission(permName, pkg, uid, getCallingUid());
        }
    }
    @Override
+2 −1
Original line number Diff line number Diff line
@@ -146,7 +146,8 @@ public abstract class PermissionManagerInternal {

    public abstract int checkPermission(@NonNull String permName, @NonNull String packageName,
            int callingUid, int userId);
    public abstract int checkUidPermission(String permName, int uid, int callingUid);
    public abstract int checkUidPermission(@NonNull String permName,
            @Nullable PackageParser.Package pkg, int uid, int callingUid);

    /**
     * Enforces the request is from the system or an app that has INTERACT_ACROSS_USERS
+8 −21
Original line number Diff line number Diff line
@@ -242,7 +242,8 @@ public class PermissionManagerService {
        return PackageManager.PERMISSION_DENIED;
    }

    private int checkUidPermission(String permName, int uid, int callingUid) {
    private int checkUidPermission(String permName, PackageParser.Package pkg, int uid,
            int callingUid) {
        final int callingUserId = UserHandle.getUserId(callingUid);
        final boolean isCallerInstantApp =
                mPackageManagerInt.getInstantAppPackageName(callingUid) != null;
@@ -253,29 +254,14 @@ public class PermissionManagerService {
            return PackageManager.PERMISSION_DENIED;
        }

        final String[] packages = mContext.getPackageManager().getPackagesForUid(uid);
        if (packages != null && packages.length > 0) {
            PackageParser.Package pkg = null;
            for (String packageName : packages) {
                pkg = mPackageManagerInt.getPackage(packageName);
        if (pkg != null) {
                    break;
                }
            }
            if (pkg == null) {
Slog.e(TAG, "TODD: No package not found; UID: " + uid);
Slog.e(TAG, "TODD: Packages: " + Arrays.toString(packages));
                return PackageManager.PERMISSION_DENIED;
            }
            if (pkg.mSharedUserId != null) {
                if (isCallerInstantApp) {
                    return PackageManager.PERMISSION_DENIED;
                }
            } else {
                if (mPackageManagerInt.filterAppAccess(pkg, callingUid, callingUserId)) {
            } else if (mPackageManagerInt.filterAppAccess(pkg, callingUid, callingUserId)) {
                return PackageManager.PERMISSION_DENIED;
            }
            }
            final PermissionsState permissionsState =
                    ((PackageSetting) pkg.mExtras).getPermissionsState();
            if (permissionsState.hasPermission(permName, userId)) {
@@ -2054,8 +2040,9 @@ Slog.e(TAG, "TODD: Packages: " + Arrays.toString(packages));
                    permName, packageName, callingUid, userId);
        }
        @Override
        public int checkUidPermission(String permName, int uid, int callingUid) {
            return PermissionManagerService.this.checkUidPermission(permName, uid, callingUid);
        public int checkUidPermission(String permName, PackageParser.Package pkg, int uid,
                int callingUid) {
            return PermissionManagerService.this.checkUidPermission(permName, pkg, uid, callingUid);
        }
        @Override
        public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags,