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

Commit bf70e9cc authored by Philip P. Moltmann's avatar Philip P. Moltmann Committed by Android (Google) Code Review
Browse files

Merge "Read newImplicit perms before modifying perm state" into qt-dev

parents 42eee014 e1233195
Loading
Loading
Loading
Loading
+15 −20
Original line number Diff line number Diff line
@@ -922,6 +922,8 @@ public class PermissionManagerService {
        permissionsState.setGlobalGids(mGlobalGids);

        synchronized (mLock) {
            ArraySet<String> newImplicitPermissions = new ArraySet<>();

            final int N = pkg.requestedPermissions.size();
            for (int i = 0; i < N; i++) {
                final String permName = pkg.requestedPermissions.get(i);
@@ -943,6 +945,17 @@ public class PermissionManagerService {
                    continue;
                }

                // Cache newImplicitPermissions before modifing permissionsState as for the shared
                // uids the original and new state are the same object
                if (!origPermissions.hasRequestedPermission(permName)
                        && pkg.implicitPermissions.contains(permName)) {
                    newImplicitPermissions.add(permName);

                    if (DEBUG_PERMISSIONS) {
                        Slog.i(TAG, permName + " is newly added for " + pkg.packageName);
                    }
                }

                // Limit ephemeral apps to ephemeral allowed permissions.
                if (pkg.applicationInfo.isInstantApp() && !bp.isInstant()) {
                    if (DEBUG_PERMISSIONS) {
@@ -1298,7 +1311,7 @@ public class PermissionManagerService {
            updatedUserIds = revokePermissionsNoLongerImplicitLocked(permissionsState, pkg,
                    updatedUserIds);
            updatedUserIds = setInitialGrantForNewImplicitPermissionsLocked(origPermissions,
                    permissionsState, pkg, updatedUserIds);
                    permissionsState, pkg, newImplicitPermissions, updatedUserIds);
        }

        // Persist the runtime permissions state for users with changes. If permissions
@@ -1437,27 +1450,9 @@ public class PermissionManagerService {
    private @NonNull int[] setInitialGrantForNewImplicitPermissionsLocked(
            @NonNull PermissionsState origPs,
            @NonNull PermissionsState ps, @NonNull PackageParser.Package pkg,
            @NonNull ArraySet<String> newImplicitPermissions,
            @NonNull int[] updatedUserIds) {
        String pkgName = pkg.packageName;
        ArraySet<String> newImplicitPermissions = new ArraySet<>();

        int numRequestedPerms = pkg.requestedPermissions.size();
        for (int i = 0; i < numRequestedPerms; i++) {
            BasePermission bp = mSettings.getPermissionLocked(pkg.requestedPermissions.get(i));
            if (bp != null) {
                String perm = bp.getName();

                if (!origPs.hasRequestedPermission(perm) && pkg.implicitPermissions.contains(
                        perm)) {
                    newImplicitPermissions.add(perm);

                    if (DEBUG_PERMISSIONS) {
                        Slog.i(TAG, perm + " is newly added for " + pkgName);
                    }
                }
            }
        }

        ArrayMap<String, ArraySet<String>> newToSplitPerms = new ArrayMap<>();

        int numSplitPerms = PermissionManager.SPLIT_PERMISSIONS.size();
+3 −0
Original line number Diff line number Diff line
@@ -11,6 +11,9 @@
                },
                {
                    "include-filter": "android.permission.cts.PermissionFlagsTest"
                },
                {
                    "include-filter": "android.permission.cts.SharedUidPermissionsTest"
                }
            ]
        },