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

Commit 2f16f84e authored by Michael Groover's avatar Michael Groover
Browse files

Add receiver flag enforcement workaround for apps targeting U

Android T allows apps to declare a runtime receiver as not exported
by invoking registerReceiver with a new RECEIVER_NOT_EXPORTED flag;
receivers registered with this flag will only receive broadcasts from
the platform and the app itself. However to ensure developers can
properly protect their receivers, all apps targeting U or later
registering a receiver for non-system broadcasts must specify either
the exported or not exported flag when invoking #registerReceiver;
if one of these flags is not provided, the platform will throw a
SecurityException. Some apps have already begun targeting U but
have not yet flagged their exposed receivers; this commit adds an
exemption for these apps to prevent them from crashing due to this
new enforcement while their receivers are updated.

Bug: 258849947
Test: Manually verified affected packages did not crash with enforcement
Change-Id: Iaa5b48f874e3aa9657b2dfd9fd2e34fe782a5a23
parent 46038f2a
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -13506,9 +13506,19 @@ public class ActivityManagerService extends IActivityManager.Stub
            // Don't enforce the flag check if we're EITHER registering for only protected
            // broadcasts, or the receiver is null (a sticky broadcast). Sticky broadcasts should
            // not be used generally, so we will be marking them as exported by default
            final boolean requireExplicitFlagForDynamicReceivers = CompatChanges.isChangeEnabled(
            boolean requireExplicitFlagForDynamicReceivers = CompatChanges.isChangeEnabled(
                    DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED, callingUid)
                    && mConstants.mEnforceReceiverExportedFlagRequirement;
            // STOPSHIP(b/259139792): Allow apps that are currently targeting U and in process of
            // updating their receivers to be exempt from this requirement until their receivers
            // are flagged.
            if (requireExplicitFlagForDynamicReceivers) {
                if ("com.google.android.apps.messaging".equals(callerPackage)) {
                    // Note, a versionCode check for this package is not performed because it could
                    // cause breakage with a subsequent update outside the system image.
                    requireExplicitFlagForDynamicReceivers = false;
                }
            }
            if (!onlyProtectedBroadcasts) {
                if (receiver == null && !explicitExportStateDefined) {
                    // sticky broadcast, no flag specified (flag isn't required)