Allow MediaCodecs to be created on behalf of other client processes.
Requires the MEDIA_RESOURCE_PID_OVERRIDE permission.
Bug: 217746837
Test: atest MediaCodecResourceTest
Change-Id: Ib6214e42b74666e2959724bb5501ae71205cf11b
diff --git a/media/utils/ProcessInfo.cpp b/media/utils/ProcessInfo.cpp
index e212794..da199c4 100644
--- a/media/utils/ProcessInfo.cpp
+++ b/media/utils/ProcessInfo.cpp
@@ -64,11 +64,27 @@
return true;
}
-bool ProcessInfo::isValidPid(int pid) {
+bool ProcessInfo::isPidTrusted(int pid) {
+ return isPidUidTrusted(pid, -1);
+}
+
+bool ProcessInfo::isPidUidTrusted(int pid, int uid) {
int callingPid = IPCThreadState::self()->getCallingPid();
int callingUid = IPCThreadState::self()->getCallingUid();
- // Trust it if this is called from the same process otherwise pid has to match the calling pid.
- return (callingPid == getpid()) || (callingPid == pid) || (callingUid == AID_MEDIA);
+ // Always trust when the caller is acting on their own behalf.
+ if (pid == callingPid && (uid == callingUid || uid == -1)) { // UID can be optional
+ return true;
+ }
+ // Implicitly trust when the caller is our own process.
+ if (callingPid == getpid()) {
+ return true;
+ }
+ // Implicitly trust when a media process is calling.
+ if (callingUid == AID_MEDIA) {
+ return true;
+ }
+ // Otherwise, allow the caller to act as another process when the caller has permissions.
+ return checkCallingPermission(String16("android.permission.MEDIA_RESOURCE_OVERRIDE_PID"));
}
bool ProcessInfo::overrideProcessInfo(int pid, int procState, int oomScore) {