From 7277f26fde08080b9d8bc520996d72f9d3bad396 Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Tue, 31 Jan 2023 19:51:56 -0600 Subject: [PATCH] Use consistent naming for sharing broadcaster's identity Android 14 added APIs to allow a broadcasting app to share its identity with receivers, but a consistent naming convention was not used in the internal APIs. This commit updates the internal APIs to use a standard "sending" prefix for the uid and package of the broadcasting app. This commit also resolves the following issues unrelated to the consistent naming convention: - If the broadcast is being delivered to the original app that sent it, skip granting app visibility since it is not required. - When the result is delivered to the app that sent the old ordered broadcast, use the information from the oldRecord to determine if identity should be shared. Bug: 259743961 Test: atest ShareIdentityTest Change-Id: I80783636e4f85ee66d253f56ee83d4b5faac4158 --- core/java/android/app/ActivityThread.java | 22 ++++++++-------- core/java/android/app/LoadedApk.java | 16 ++++++------ core/java/android/app/ReceiverInfo.aidl | 4 +-- .../android/server/am/BroadcastQueueImpl.java | 2 +- .../server/am/BroadcastQueueModernImpl.java | 2 +- .../server/am/BroadcastReceiverBatch.java | 25 ++++++++++--------- .../am/SameProcessApplicationThread.java | 16 ++++++------ 7 files changed, 44 insertions(+), 43 deletions(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 170c0b4e0bb19..d974a2482e09b 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -785,10 +785,10 @@ public final class ActivityThread extends ClientTransactionHandler static final class ReceiverData extends BroadcastReceiver.PendingResult { public ReceiverData(Intent intent, int resultCode, String resultData, Bundle resultExtras, boolean ordered, boolean sticky, boolean assumeDelivered, IBinder token, - int sendingUser, int sentFromUid, String sentFromPackage) { + int sendingUser, int sendingUid, String sendingPackage) { super(resultCode, resultData, resultExtras, TYPE_COMPONENT, ordered, sticky, - assumeDelivered, token, sendingUser, intent.getFlags(), sentFromUid, - sentFromPackage); + assumeDelivered, token, sendingUser, intent.getFlags(), sendingUid, + sendingPackage); this.intent = intent; } @@ -1044,11 +1044,11 @@ public final class ActivityThread extends ClientTransactionHandler public final void scheduleReceiver(Intent intent, ActivityInfo info, CompatibilityInfo compatInfo, int resultCode, String data, Bundle extras, boolean ordered, boolean assumeDelivered, int sendingUser, int processState, - int sentFromUid, String sentFromPackage) { + int sendingUid, String sendingPackage) { updateProcessState(processState, false); ReceiverData r = new ReceiverData(intent, resultCode, data, extras, ordered, false, assumeDelivered, mAppThread.asBinder(), sendingUser, - sentFromUid, sentFromPackage); + sendingUid, sendingPackage); r.info = info; sendMessage(H.RECEIVER, r); } @@ -1060,12 +1060,12 @@ public final class ActivityThread extends ClientTransactionHandler scheduleRegisteredReceiver(r.receiver, r.intent, r.resultCode, r.data, r.extras, r.ordered, r.sticky, r.assumeDelivered, r.sendingUser, r.processState, - r.sentFromUid, r.sentFromPackage); + r.sendingUid, r.sendingPackage); } else { scheduleReceiver(r.intent, r.activityInfo, r.compatInfo, r.resultCode, r.data, r.extras, r.sync, r.assumeDelivered, r.sendingUser, r.processState, - r.sentFromUid, r.sentFromPackage); + r.sendingUid, r.sendingPackage); } } } @@ -1296,7 +1296,7 @@ public final class ActivityThread extends ClientTransactionHandler public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String dataStr, Bundle extras, boolean ordered, boolean sticky, boolean assumeDelivered, int sendingUser, int processState, - int sentFromUid, String sentFromPackage) + int sendingUid, String sendingPackage) throws RemoteException { updateProcessState(processState, false); @@ -1307,16 +1307,16 @@ public final class ActivityThread extends ClientTransactionHandler if (receiver instanceof LoadedApk.ReceiverDispatcher.InnerReceiver) { ((LoadedApk.ReceiverDispatcher.InnerReceiver) receiver).performReceive(intent, resultCode, dataStr, extras, ordered, sticky, assumeDelivered, sendingUser, - sentFromUid, sentFromPackage); + sendingUid, sendingPackage); } else { if (!assumeDelivered) { Log.wtf(TAG, "scheduleRegisteredReceiver() called for " + receiver + " and " + intent + " without mechanism to finish delivery"); } - if (sentFromUid != Process.INVALID_UID || sentFromPackage != null) { + if (sendingUid != Process.INVALID_UID || sendingPackage != null) { Log.wtf(TAG, "scheduleRegisteredReceiver() called for " + receiver + " and " + intent - + " from " + sentFromPackage + " (UID: " + sentFromUid + + " from " + sendingPackage + " (UID: " + sendingUid + ") without mechanism to propagate the sender's identity"); } receiver.performReceive(intent, resultCode, dataStr, extras, ordered, sticky, diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index c13da0b07981c..dd6b8b517a862 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -1683,13 +1683,13 @@ public final class LoadedApk { performReceive(intent, resultCode, data, extras, ordered, sticky, BroadcastReceiver.PendingResult.guessAssumeDelivered( BroadcastReceiver.PendingResult.TYPE_REGISTERED, ordered), - sendingUser, /*sentFromUid=*/ Process.INVALID_UID, - /*sentFromPackage=*/ null); + sendingUser, /*sendingUid=*/ Process.INVALID_UID, + /*sendingPackage=*/ null); } public void performReceive(Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, boolean assumeDelivered, - int sendingUser, int sentFromUid, String sentFromPackage) { + int sendingUser, int sendingUid, String sendingPackage) { final LoadedApk.ReceiverDispatcher rd; if (intent == null) { Log.wtf(TAG, "Null intent received"); @@ -1705,7 +1705,7 @@ public final class LoadedApk { if (rd != null) { rd.performReceive(intent, resultCode, data, extras, ordered, sticky, assumeDelivered, sendingUser, - sentFromUid, sentFromPackage); + sendingUid, sendingPackage); } else if (!assumeDelivered) { // The activity manager dispatched a broadcast to a registered // receiver in this process, but before it could be delivered the @@ -1746,11 +1746,11 @@ public final class LoadedApk { public Args(Intent intent, int resultCode, String resultData, Bundle resultExtras, boolean ordered, boolean sticky, boolean assumeDelivered, int sendingUser, - int sentFromUid, String sentFromPackage) { + int sendingUid, String sendingPackage) { super(resultCode, resultData, resultExtras, mRegistered ? TYPE_REGISTERED : TYPE_UNREGISTERED, ordered, sticky, assumeDelivered, mAppThread.asBinder(), sendingUser, - intent.getFlags(), sentFromUid, sentFromPackage); + intent.getFlags(), sendingUid, sendingPackage); mCurIntent = intent; } @@ -1874,9 +1874,9 @@ public final class LoadedApk { public void performReceive(Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, boolean assumeDelivered, - int sendingUser, int sentFromUid, String sentFromPackage) { + int sendingUser, int sendingUid, String sendingPackage) { final Args args = new Args(intent, resultCode, data, extras, ordered, - sticky, assumeDelivered, sendingUser, sentFromUid, sentFromPackage); + sticky, assumeDelivered, sendingUser, sendingUid, sendingPackage); if (intent == null) { Log.wtf(TAG, "Null intent received"); } else { diff --git a/core/java/android/app/ReceiverInfo.aidl b/core/java/android/app/ReceiverInfo.aidl index 7364d0f90e922..6916f71bd6159 100644 --- a/core/java/android/app/ReceiverInfo.aidl +++ b/core/java/android/app/ReceiverInfo.aidl @@ -38,8 +38,8 @@ parcelable ReceiverInfo { int sendingUser; int processState; int resultCode; - int sentFromUid = -1; - String sentFromPackage; + int sendingUid = -1; + String sendingPackage; /** * True if this instance represents a registered receiver and false if this instance diff --git a/services/core/java/com/android/server/am/BroadcastQueueImpl.java b/services/core/java/com/android/server/am/BroadcastQueueImpl.java index 7290f329aa970..c07ef1d12c91d 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueImpl.java @@ -273,7 +273,7 @@ public class BroadcastQueueImpl extends BroadcastQueue { performReceiveLocked(oldRecord.resultToApp, oldRecord.resultTo, oldRecord.intent, Activity.RESULT_CANCELED, null, null, - false, false, r.shareIdentity, oldRecord.userId, + false, false, oldRecord.shareIdentity, oldRecord.userId, oldRecord.callingUid, r.callingUid, r.callerPackage, SystemClock.uptimeMillis() - oldRecord.enqueueTime, 0); } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index b952ce0946e04..f954420fc6aef 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -1064,7 +1064,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { if (thread != null) { mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily( app, OOM_ADJ_REASON_FINISH_RECEIVER); - if (r.shareIdentity) { + if (r.shareIdentity && app.uid != r.callingUid) { mService.mPackageManagerInt.grantImplicitAccess(r.userId, r.intent, UserHandle.getAppId(app.uid), r.callingUid, true); } diff --git a/services/core/java/com/android/server/am/BroadcastReceiverBatch.java b/services/core/java/com/android/server/am/BroadcastReceiverBatch.java index 153403a037a28..63575ba383058 100644 --- a/services/core/java/com/android/server/am/BroadcastReceiverBatch.java +++ b/services/core/java/com/android/server/am/BroadcastReceiverBatch.java @@ -171,8 +171,9 @@ final class BroadcastReceiverBatch { // Add a ReceiverInfo for a registered receiver. void schedule(@Nullable IIntentReceiver receiver, Intent intent, int resultCode, @Nullable String data, @Nullable Bundle extras, boolean ordered, - boolean sticky, boolean assumeDelivered, int sendingUser, int callingUid, - String callingPackage, int processState, @Nullable BroadcastRecord r, int index) { + boolean sticky, boolean assumeDelivered, int sendingUser, int sendingUid, + @Nullable String sendingPackage, int processState, @Nullable BroadcastRecord r, + int index) { ReceiverInfo ri = new ReceiverInfo(); ri.intent = intent; ri.data = data; @@ -185,8 +186,8 @@ final class BroadcastReceiverBatch { ri.receiver = receiver; ri.ordered = ordered; ri.sticky = sticky; - ri.sentFromUid = callingUid; - ri.sentFromPackage = callingPackage; + ri.sendingUid = sendingUid; + ri.sendingPackage = sendingPackage; mReceivers.add(ri); mCookies.add(cookiePool.next().set(r, index)); @@ -195,7 +196,7 @@ final class BroadcastReceiverBatch { void schedule(@Nullable Intent intent, @Nullable ActivityInfo activityInfo, @Nullable CompatibilityInfo compatInfo, int resultCode, @Nullable String data, @Nullable Bundle extras, boolean sync, boolean assumeDelivered, int sendingUser, - int callingUid, @Nullable String callingPackage, int processState, + int sendingUid, @Nullable String sendingPackage, int processState, @Nullable BroadcastRecord r, int index) { ReceiverInfo ri = new ReceiverInfo(); ri.intent = intent; @@ -209,8 +210,8 @@ final class BroadcastReceiverBatch { ri.activityInfo = activityInfo; ri.compatInfo = compatInfo; ri.sync = sync; - ri.sentFromUid = callingUid; - ri.sentFromPackage = callingPackage; + ri.sendingUid = sendingUid; + ri.sendingPackage = sendingPackage; mReceivers.add(ri); mCookies.add(cookiePool.next().set(r, index)); } @@ -223,21 +224,21 @@ final class BroadcastReceiverBatch { ArrayList registeredReceiver(@Nullable IIntentReceiver receiver, @Nullable Intent intent, int resultCode, @Nullable String data, @Nullable Bundle extras, boolean ordered, boolean sticky, boolean assumeDelivered, - int sendingUser, int callingUid, String callingPackage, int processState) { + int sendingUser, int sendingUid, @Nullable String sendingPackage, int processState) { reset(); schedule(receiver, intent, resultCode, data, extras, ordered, sticky, assumeDelivered, - sendingUser, callingUid, callingPackage, processState, null, 0); + sendingUser, sendingUid, sendingPackage, processState, null, 0); return receivers(); } ArrayList manifestReceiver(@Nullable Intent intent, @Nullable ActivityInfo activityInfo, @Nullable CompatibilityInfo compatInfo, int resultCode, @Nullable String data, @Nullable Bundle extras, boolean sync, - boolean assumeDelivered, int sendingUser, int callingUid, String callingPackage, - int processState) { + boolean assumeDelivered, int sendingUser, int sendingUid, + @Nullable String sendingPackage, int processState) { reset(); schedule(intent, activityInfo, compatInfo, resultCode, data, extras, sync, assumeDelivered, - sendingUser, callingUid, callingPackage, processState, null, 0); + sendingUser, sendingUid, sendingPackage, processState, null, 0); return receivers(); } diff --git a/services/core/java/com/android/server/am/SameProcessApplicationThread.java b/services/core/java/com/android/server/am/SameProcessApplicationThread.java index dcb02ea8989ed..82dd5c2cf2c3d 100644 --- a/services/core/java/com/android/server/am/SameProcessApplicationThread.java +++ b/services/core/java/com/android/server/am/SameProcessApplicationThread.java @@ -48,12 +48,12 @@ public class SameProcessApplicationThread extends IApplicationThread.Default { @Override public void scheduleReceiver(Intent intent, ActivityInfo info, CompatibilityInfo compatInfo, int resultCode, String data, Bundle extras, boolean ordered, boolean assumeDelivered, - int sendingUser, int processState, int sentFromUid, String sentFromPackage) { + int sendingUser, int processState, int sendingUid, String sendingPackage) { mHandler.post(() -> { try { mWrapped.scheduleReceiver(intent, info, compatInfo, resultCode, data, extras, - ordered, assumeDelivered, sendingUser, processState, sentFromUid, - sentFromPackage); + ordered, assumeDelivered, sendingUser, processState, sendingUid, + sendingPackage); } catch (RemoteException e) { throw new RuntimeException(e); } @@ -63,12 +63,12 @@ public class SameProcessApplicationThread extends IApplicationThread.Default { @Override public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, boolean assumeDelivered, - int sendingUser, int processState, int sentFromUid, String sentFromPackage) { + int sendingUser, int processState, int sendingUid, String sendingPackage) { mHandler.post(() -> { try { mWrapped.scheduleRegisteredReceiver(receiver, intent, resultCode, data, extras, - ordered, sticky, assumeDelivered, sendingUser, processState, sentFromUid, - sentFromPackage); + ordered, sticky, assumeDelivered, sendingUser, processState, sendingUid, + sendingPackage); } catch (RemoteException e) { throw new RuntimeException(e); } @@ -82,11 +82,11 @@ public class SameProcessApplicationThread extends IApplicationThread.Default { if (r.registered) { scheduleRegisteredReceiver(r.receiver, r.intent, r.resultCode, r.data, r.extras, r.ordered, r.sticky, r.assumeDelivered, - r.sendingUser, r.processState, r.sentFromUid, r.sentFromPackage); + r.sendingUser, r.processState, r.sendingUid, r.sendingPackage); } else { scheduleReceiver(r.intent, r.activityInfo, r.compatInfo, r.resultCode, r.data, r.extras, r.sync, r.assumeDelivered, - r.sendingUser, r.processState, r.sentFromUid, r.sentFromPackage); + r.sendingUser, r.processState, r.sendingUid, r.sendingPackage); } } }