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

Commit 231fc7e8 authored by Christopher Tate's avatar Christopher Tate Committed by Alexandre Roux
Browse files

Make sure parallel broadcasts enforce excluded permissions

Bug: 211029161
Bug: 210118427
Test: atest android.content.cts.ContextWrapperTest#testSendBroadcastRequireNoneOfPermissions_receiverHasExcludedPermissions
Merged-In: Ib4fafe2423c7ded1daf1b763f8103601c0e2c852
Change-Id: Ib4fafe2423c7ded1daf1b763f8103601c0e2c852
(cherry picked from commit 0eee4fa4)
Merged-In: Ib4fafe2423c7ded1daf1b763f8103601c0e2c852
parent fd237e10
Loading
Loading
Loading
Loading
+48 −0
Original line number Diff line number Diff line
@@ -768,6 +768,54 @@ public final class BroadcastQueue {
            }
        }

        // Check that the receiver does *not* have any excluded permissions
        if (!skip && r.excludedPermissions != null && r.excludedPermissions.length > 0) {
            for (int i = 0; i < r.excludedPermissions.length; i++) {
                String excludedPermission = r.excludedPermissions[i];
                final int perm = mService.checkComponentPermission(excludedPermission,
                        filter.receiverList.pid, filter.receiverList.uid, -1, true);

                int appOp = AppOpsManager.permissionToOpCode(excludedPermission);
                if (appOp != AppOpsManager.OP_NONE) {
                    // When there is an app op associated with the permission,
                    // skip when both the permission and the app op are
                    // granted.
                    if ((perm == PackageManager.PERMISSION_GRANTED) && (
                            mService.getAppOpsManager().checkOpNoThrow(appOp,
                                    filter.receiverList.uid,
                                    filter.packageName)
                                    == AppOpsManager.MODE_ALLOWED)) {
                        Slog.w(TAG, "Appop Denial: receiving "
                                + r.intent.toString()
                                + " to " + filter.receiverList.app
                                + " (pid=" + filter.receiverList.pid
                                + ", uid=" + filter.receiverList.uid + ")"
                                + " excludes appop " + AppOpsManager.permissionToOp(
                                excludedPermission)
                                + " due to sender " + r.callerPackage
                                + " (uid " + r.callingUid + ")");
                        skip = true;
                        break;
                    }
                } else {
                    // When there is no app op associated with the permission,
                    // skip when permission is granted.
                    if (perm == PackageManager.PERMISSION_GRANTED) {
                        Slog.w(TAG, "Permission Denial: receiving "
                                + r.intent.toString()
                                + " to " + filter.receiverList.app
                                + " (pid=" + filter.receiverList.pid
                                + ", uid=" + filter.receiverList.uid + ")"
                                + " excludes " + excludedPermission
                                + " due to sender " + r.callerPackage
                                + " (uid " + r.callingUid + ")");
                        skip = true;
                        break;
                    }
                }
            }
        }

        // Check that the receiver does *not* belong to any of the excluded packages
        if (!skip && r.excludedPackages != null && r.excludedPackages.length > 0) {
            if (ArrayUtils.contains(r.excludedPackages, filter.packageName)) {