DO NOT MERGE: Context#startInstrumentation could be started from SHELL only now. am: 2d20bee73d
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20283592 Change-Id: I37245593a4a8b7c0f5225d38bdb3054d883a6bb2 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -15757,6 +15757,17 @@ public class ActivityManagerService extends IActivityManager.Stub
|
||||
reportStartInstrumentationFailureLocked(watcher, className, msg);
|
||||
throw new SecurityException(msg);
|
||||
}
|
||||
if (!Build.IS_DEBUGGABLE && callingUid != ROOT_UID && callingUid != SHELL_UID
|
||||
&& callingUid != SYSTEM_UID && !hasActiveInstrumentationLocked(callingPid)) {
|
||||
// If it's not debug build and not called from root/shell/system uid, reject it.
|
||||
final String msg = "Permission Denial: instrumentation test "
|
||||
+ className + " from pid=" + callingPid + ", uid=" + callingUid
|
||||
+ ", pkgName=" + getPackageNameByPid(callingPid)
|
||||
+ " not allowed because it's not started from SHELL";
|
||||
Slog.wtfQuiet(TAG, msg);
|
||||
reportStartInstrumentationFailureLocked(watcher, className, msg);
|
||||
throw new SecurityException(msg);
|
||||
}
|
||||
|
||||
ActiveInstrumentation activeInstr = new ActiveInstrumentation(this);
|
||||
activeInstr.mClass = className;
|
||||
@@ -15812,6 +15823,29 @@ public class ActivityManagerService extends IActivityManager.Stub
|
||||
return true;
|
||||
}
|
||||
|
||||
@GuardedBy("this")
|
||||
private boolean hasActiveInstrumentationLocked(int pid) {
|
||||
if (pid == 0) {
|
||||
return false;
|
||||
}
|
||||
synchronized (mPidsSelfLocked) {
|
||||
ProcessRecord process = mPidsSelfLocked.get(pid);
|
||||
return process != null && process.getActiveInstrumentation() != null;
|
||||
}
|
||||
}
|
||||
|
||||
private String getPackageNameByPid(int pid) {
|
||||
synchronized (mPidsSelfLocked) {
|
||||
final ProcessRecord app = mPidsSelfLocked.get(pid);
|
||||
|
||||
if (app != null && app.info != null) {
|
||||
return app.info.packageName;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isCallerShell() {
|
||||
final int callingUid = Binder.getCallingUid();
|
||||
return callingUid == SHELL_UID || callingUid == ROOT_UID;
|
||||
|
||||
Reference in New Issue
Block a user