Revert "Revert "Allow protected or sticky broadcasts without flags.""

This reverts commit afe8e4eb0b.

Reason for revert: We still need this change so we're fixing it

Change-Id: Ia49f10c9d245ba90ac7c3d6a77064e6aad30f428
Fixes: 207375918
Fixes: 207380419
Fixes: 207365047
Fixes: 207365144
Fixes: 207365104
Fixes: 207377503
Fixes: 207377500
Fixes: 207377676
Fixes: 207380419
Fixes: 207380420
Fixes: 207380486
Fixes: 207381834
This commit is contained in:
Jacob Hobbie
2021-11-22 18:58:44 +00:00
parent afe8e4eb0b
commit 56448aa7e0

View File

@@ -12662,30 +12662,38 @@ public class ActivityManagerService extends IActivityManager.Stub
"Receiver can't specify both RECEIVER_EXPORTED and RECEIVER_NOT_EXPORTED"
+ "flag");
}
if (CompatChanges.isChangeEnabled(DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED,
callingUid)
&& !explicitExportStateDefined) {
if (ENFORCE_DYNAMIC_RECEIVER_EXPLICIT_EXPORT) {
throw new SecurityException(
callerPackage + ": Targeting T+ (version "
+ Build.VERSION_CODES.TIRAMISU
+ " and above) requires that one of RECEIVER_EXPORTED or "
+ "RECEIVER_NOT_EXPORTED be specified when registering a "
+ "receiver");
} else {
Slog.wtf(TAG,
callerPackage + ": Targeting T+ (version "
+ Build.VERSION_CODES.TIRAMISU
+ " and above) requires that one of RECEIVER_EXPORTED or "
+ "RECEIVER_NOT_EXPORTED be specified when registering a "
+ "receiver");
// Assume default behavior-- flag check is not enforced
// 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(
DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED, callingUid);
if (!onlyProtectedBroadcasts) {
if (receiver == null && !explicitExportStateDefined) {
// sticky broadcast, no flag specified (flag isn't required)
flags |= Context.RECEIVER_EXPORTED;
} else if (requireExplicitFlagForDynamicReceivers && !explicitExportStateDefined) {
if (ENFORCE_DYNAMIC_RECEIVER_EXPLICIT_EXPORT) {
throw new SecurityException(
callerPackage + ": Targeting T+ (version "
+ Build.VERSION_CODES.TIRAMISU
+ " and above) requires that one of RECEIVER_EXPORTED or "
+ "RECEIVER_NOT_EXPORTED be specified when registering a "
+ "receiver");
} else {
Slog.wtf(TAG,
callerPackage + ": Targeting T+ (version "
+ Build.VERSION_CODES.TIRAMISU
+ " and above) requires that one of RECEIVER_EXPORTED or "
+ "RECEIVER_NOT_EXPORTED be specified when registering a "
+ "receiver");
// Assume default behavior-- flag check is not enforced
flags |= Context.RECEIVER_EXPORTED;
}
} else if (!requireExplicitFlagForDynamicReceivers) {
// Change is not enabled, thus not targeting T+. Assume exported.
flags |= Context.RECEIVER_EXPORTED;
}
} else if (!CompatChanges.isChangeEnabled(DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED,
callingUid)) {
// Change is not enabled, thus not targeting T+. Assume exported.
flags |= Context.RECEIVER_EXPORTED;
}
}
@@ -12703,7 +12711,7 @@ public class ActivityManagerService extends IActivityManager.Stub
(intent.getFlags() & Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS) == 0) {
continue;
}
// If intent has scheme "content", it will need to acccess
// If intent has scheme "content", it will need to access
// provider that needs to lock mProviderMap in ActivityThread
// and also it may need to wait application response, so we
// cannot lock ActivityManagerService here.