Skip to content

Commit 7fa5e42

Browse files
Nate MyrenAndroid Build Coastguard Worker
authored andcommitted
RESTRICT AUTOMERGE Use chain start token in performOpTransaction
Bug: 258672042 Test: atest CtsPermission4TestCases Change-Id: I1d484ed7c72d4ae73f4cbec47522a18ae9088f6e (cherry picked from commit 297388e) Merged-In: I1d484ed7c72d4ae73f4cbec47522a18ae9088f6e
1 parent d0bc902 commit 7fa5e42

7 files changed

Lines changed: 104 additions & 96 deletions

File tree

core/java/android/app/AppOpsManager.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9134,8 +9134,9 @@ public int startProxyOpNoThrow(@NonNull String op, int proxiedUid,
91349134
*/
91359135
public int startProxyOpNoThrow(int op, @NonNull AttributionSource attributionSource,
91369136
@Nullable String message, boolean skipProxyOperation) {
9137-
return startProxyOpNoThrow(op, attributionSource, message, skipProxyOperation,
9138-
ATTRIBUTION_FLAGS_NONE, ATTRIBUTION_FLAGS_NONE, ATTRIBUTION_CHAIN_ID_NONE);
9137+
return startProxyOpNoThrow(attributionSource.getToken(), op, attributionSource, message,
9138+
skipProxyOperation, ATTRIBUTION_FLAGS_NONE, ATTRIBUTION_FLAGS_NONE,
9139+
ATTRIBUTION_CHAIN_ID_NONE);
91399140
}
91409141

91419142
/**
@@ -9147,7 +9148,8 @@ public int startProxyOpNoThrow(int op, @NonNull AttributionSource attributionSou
91479148
*
91489149
* @hide
91499150
*/
9150-
public int startProxyOpNoThrow(int op, @NonNull AttributionSource attributionSource,
9151+
public int startProxyOpNoThrow(@NonNull IBinder clientId, int op,
9152+
@NonNull AttributionSource attributionSource,
91519153
@Nullable String message, boolean skipProxyOperation, @AttributionFlags
91529154
int proxyAttributionFlags, @AttributionFlags int proxiedAttributionFlags,
91539155
int attributionChainId) {
@@ -9165,7 +9167,7 @@ public int startProxyOpNoThrow(int op, @NonNull AttributionSource attributionSou
91659167
}
91669168
}
91679169

9168-
SyncNotedAppOp syncOp = mService.startProxyOperation(op,
9170+
SyncNotedAppOp syncOp = mService.startProxyOperation(clientId, op,
91699171
attributionSource, false, collectionMode == COLLECT_ASYNC, message,
91709172
shouldCollectMessage, skipProxyOperation, proxyAttributionFlags,
91719173
proxiedAttributionFlags, attributionChainId);
@@ -9263,9 +9265,10 @@ public void finishOp(IBinder token, int op, int uid, @NonNull String packageName
92639265
*/
92649266
public void finishProxyOp(@NonNull String op, int proxiedUid,
92659267
@NonNull String proxiedPackageName, @Nullable String proxiedAttributionTag) {
9266-
finishProxyOp(op, new AttributionSource(mContext.getAttributionSource(),
9268+
IBinder token = mContext.getAttributionSource().getToken();
9269+
finishProxyOp(token, op, new AttributionSource(mContext.getAttributionSource(),
92679270
new AttributionSource(proxiedUid, proxiedPackageName, proxiedAttributionTag,
9268-
mContext.getAttributionSource().getToken())), /*skipProxyOperation*/ false);
9271+
token)), /*skipProxyOperation*/ false);
92699272
}
92709273

92719274
/**
@@ -9280,10 +9283,11 @@ public void finishProxyOp(@NonNull String op, int proxiedUid,
92809283
*
92819284
* @hide
92829285
*/
9283-
public void finishProxyOp(@NonNull String op, @NonNull AttributionSource attributionSource,
9284-
boolean skipProxyOperation) {
9286+
public void finishProxyOp(@NonNull IBinder clientId, @NonNull String op,
9287+
@NonNull AttributionSource attributionSource, boolean skipProxyOperation) {
92859288
try {
9286-
mService.finishProxyOperation(strOpToOp(op), attributionSource, skipProxyOperation);
9289+
mService.finishProxyOperation(clientId, strOpToOp(op), attributionSource,
9290+
skipProxyOperation);
92879291
} catch (RemoteException e) {
92889292
throw e.rethrowFromSystemServer();
92899293
}

core/java/android/app/AppOpsManagerInternal.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,11 @@
2626
import android.util.SparseIntArray;
2727

2828
import com.android.internal.app.IAppOpsCallback;
29-
import com.android.internal.util.function.DecFunction;
3029
import com.android.internal.util.function.HeptFunction;
3130
import com.android.internal.util.function.HexFunction;
3231
import com.android.internal.util.function.QuadFunction;
3332
import com.android.internal.util.function.QuintConsumer;
3433
import com.android.internal.util.function.QuintFunction;
35-
import com.android.internal.util.function.TriFunction;
3634
import com.android.internal.util.function.UndecFunction;
3735

3836
/**
@@ -135,6 +133,7 @@ SyncNotedAppOp startOperation(IBinder token, int code, int uid,
135133
/**
136134
* Allows overriding start proxy operation behavior.
137135
*
136+
* @param clientId The client calling start, represented by an IBinder
138137
* @param code The op code to start.
139138
* @param attributionSource The permission identity of the caller.
140139
* @param startIfModeDefault Whether to start the op of the mode is default.
@@ -148,11 +147,12 @@ SyncNotedAppOp startOperation(IBinder token, int code, int uid,
148147
* @param superImpl The super implementation.
149148
* @return The app op note result.
150149
*/
151-
SyncNotedAppOp startProxyOperation(int code, @NonNull AttributionSource attributionSource,
152-
boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp, String message,
153-
boolean shouldCollectMessage, boolean skipProxyOperation, @AttributionFlags
154-
int proxyAttributionFlags, @AttributionFlags int proxiedAttributionFlags,
155-
int attributionChainId, @NonNull DecFunction<Integer, AttributionSource, Boolean,
150+
SyncNotedAppOp startProxyOperation(@NonNull IBinder clientId, int code,
151+
@NonNull AttributionSource attributionSource, boolean startIfModeDefault,
152+
boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage,
153+
boolean skipProxyOperation, @AttributionFlags int proxyAttributionFlags,
154+
@AttributionFlags int proxiedAttributionFlags, int attributionChainId,
155+
@NonNull UndecFunction<IBinder, Integer, AttributionSource, Boolean,
156156
Boolean, String, Boolean, Boolean, Integer, Integer, Integer,
157157
SyncNotedAppOp> superImpl);
158158

@@ -176,10 +176,15 @@ default void finishOperation(IBinder clientId, int code, int uid, String package
176176
*
177177
* @param code The op code to finish.
178178
* @param attributionSource The permission identity of the caller.
179+
* @param skipProxyOperation Whether to skip the proxy in the proxy/proxied operation
180+
* @param clientId The client calling finishProxyOperation
181+
* @param superImpl The "standard" implementation to potentially call
179182
*/
180-
void finishProxyOperation(int code, @NonNull AttributionSource attributionSource,
183+
void finishProxyOperation(@NonNull IBinder clientId, int code,
184+
@NonNull AttributionSource attributionSource,
181185
boolean skipProxyOperation,
182-
@NonNull TriFunction<Integer, AttributionSource, Boolean, Void> superImpl);
186+
@NonNull QuadFunction<IBinder, Integer, AttributionSource, Boolean,
187+
Void> superImpl);
183188
}
184189

185190
/**

core/java/com/android/internal/app/IAppOpsService.aidl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,12 @@ interface IAppOpsService {
5858
SyncNotedAppOp noteProxyOperation(int code, in AttributionSource attributionSource,
5959
boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage,
6060
boolean skipProxyOperation);
61-
SyncNotedAppOp startProxyOperation(int code, in AttributionSource attributionSource,
62-
boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp, String message,
63-
boolean shouldCollectMessage, boolean skipProxyOperation, int proxyAttributionFlags,
64-
int proxiedAttributionFlags, int attributionChainId);
65-
void finishProxyOperation(int code, in AttributionSource attributionSource,
61+
SyncNotedAppOp startProxyOperation(IBinder clientId, int code,
62+
in AttributionSource attributionSource, boolean startIfModeDefault,
63+
boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage,
64+
boolean skipProxyOperation, int proxyAttributionFlags, int proxiedAttributionFlags,
65+
int attributionChainId);
66+
void finishProxyOperation(IBinder clientId, int code, in AttributionSource attributionSource,
6667
boolean skipProxyOperation);
6768

6869
// Remaining methods are only used in Java.

services/core/java/com/android/server/am/ActivityManagerService.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -369,12 +369,10 @@
369369
import com.android.internal.util.FrameworkStatsLog;
370370
import com.android.internal.util.MemInfoReader;
371371
import com.android.internal.util.Preconditions;
372-
import com.android.internal.util.function.DecFunction;
373372
import com.android.internal.util.function.HeptFunction;
374373
import com.android.internal.util.function.HexFunction;
375374
import com.android.internal.util.function.QuadFunction;
376375
import com.android.internal.util.function.QuintFunction;
377-
import com.android.internal.util.function.TriFunction;
378376
import com.android.internal.util.function.UndecFunction;
379377
import com.android.server.AlarmManagerInternal;
380378
import com.android.server.DeviceIdleInternal;
@@ -18321,19 +18319,20 @@ public SyncNotedAppOp startOperation(IBinder token, int code, int uid,
1832118319
}
1832218320

1832318321
@Override
18324-
public SyncNotedAppOp startProxyOperation(int code,
18322+
public SyncNotedAppOp startProxyOperation(@NonNull IBinder clientId, int code,
1832518323
@NonNull AttributionSource attributionSource, boolean startIfModeDefault,
1832618324
boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage,
1832718325
boolean skipProxyOperation, @AttributionFlags int proxyAttributionFlags,
1832818326
@AttributionFlags int proxiedAttributionFlags, int attributionChainId,
18329-
@NonNull DecFunction<Integer, AttributionSource, Boolean, Boolean, String, Boolean,
18330-
Boolean, Integer, Integer, Integer, SyncNotedAppOp> superImpl) {
18327+
@NonNull UndecFunction<IBinder, Integer, AttributionSource,
18328+
Boolean, Boolean, String, Boolean, Boolean, Integer, Integer, Integer,
18329+
SyncNotedAppOp> superImpl) {
1833118330
if (attributionSource.getUid() == mTargetUid && isTargetOp(code)) {
1833218331
final int shellUid = UserHandle.getUid(UserHandle.getUserId(
1833318332
attributionSource.getUid()), Process.SHELL_UID);
1833418333
final long identity = Binder.clearCallingIdentity();
1833518334
try {
18336-
return superImpl.apply(code, new AttributionSource(shellUid,
18335+
return superImpl.apply(clientId, code, new AttributionSource(shellUid,
1833718336
"com.android.shell", attributionSource.getAttributionTag(),
1833818337
attributionSource.getToken(), attributionSource.getNext()),
1833918338
startIfModeDefault, shouldCollectAsyncNotedOp, message,
@@ -18343,29 +18342,30 @@ public SyncNotedAppOp startProxyOperation(int code,
1834318342
Binder.restoreCallingIdentity(identity);
1834418343
}
1834518344
}
18346-
return superImpl.apply(code, attributionSource, startIfModeDefault,
18345+
return superImpl.apply(clientId, code, attributionSource, startIfModeDefault,
1834718346
shouldCollectAsyncNotedOp, message, shouldCollectMessage, skipProxyOperation,
1834818347
proxyAttributionFlags, proxiedAttributionFlags, attributionChainId);
1834918348
}
1835018349

1835118350
@Override
18352-
public void finishProxyOperation(int code, @NonNull AttributionSource attributionSource,
18353-
boolean skipProxyOperation, @NonNull TriFunction<Integer, AttributionSource,
18354-
Boolean, Void> superImpl) {
18351+
public void finishProxyOperation(@NonNull IBinder clientId, int code,
18352+
@NonNull AttributionSource attributionSource, boolean skipProxyOperation,
18353+
@NonNull QuadFunction<IBinder, Integer, AttributionSource, Boolean,
18354+
Void> superImpl) {
1835518355
if (attributionSource.getUid() == mTargetUid && isTargetOp(code)) {
1835618356
final int shellUid = UserHandle.getUid(UserHandle.getUserId(
1835718357
attributionSource.getUid()), Process.SHELL_UID);
1835818358
final long identity = Binder.clearCallingIdentity();
1835918359
try {
18360-
superImpl.apply(code, new AttributionSource(shellUid,
18360+
superImpl.apply(clientId, code, new AttributionSource(shellUid,
1836118361
"com.android.shell", attributionSource.getAttributionTag(),
1836218362
attributionSource.getToken(), attributionSource.getNext()),
1836318363
skipProxyOperation);
1836418364
} finally {
1836518365
Binder.restoreCallingIdentity(identity);
1836618366
}
1836718367
}
18368-
superImpl.apply(code, attributionSource, skipProxyOperation);
18368+
superImpl.apply(clientId, code, attributionSource, skipProxyOperation);
1836918369
}
1837018370

1837118371
private boolean isTargetOp(int code) {

0 commit comments

Comments
 (0)