diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-01-22 18:39:52 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-01-22 18:39:52 +0000 |
commit | 75175d552afddeb9f91c2e9c6fa3ae26b167d69c (patch) | |
tree | fcfa839c955d7bb4b3f9df73df35a096add58f9e | |
parent | ac54458171005001fb40e1f4f4ca75671619a9de (diff) | |
parent | 4c8832e7e05bf9635dc2fd2719a949839a58c90c (diff) | |
download | base-75175d552afddeb9f91c2e9c6fa3ae26b167d69c.tar.gz |
Merge cherrypicks of ['googleplex-android-review.googlesource.com/25969349'] into sparse-11335772-L45600030001479295.
SPARSE_CHANGE: I84d072c14ff01422560c241a69cb9f4e02c47e74
Change-Id: I02b4851ae46c2fbcc4ac8a8a7fd2533445ea7041
-rw-r--r-- | core/jni/android_util_Process.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 91dfc6023e42..fc059109e9b2 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -28,6 +28,7 @@ #include <meminfo/sysmeminfo.h> #include <processgroup/processgroup.h> #include <processgroup/sched_policy.h> +#include <android-base/stringprintf.h> #include <android-base/unique_fd.h> #include <algorithm> @@ -64,6 +65,7 @@ #define GUARD_THREAD_PRIORITY 0 using namespace android; +using ::android::base::StringPrintf; static constexpr bool kDebugPolicy = false; static constexpr bool kDebugProc = false; @@ -232,6 +234,26 @@ void android_os_Process_setThreadGroupAndCpuset(JNIEnv* env, jobject clazz, int } } +// Look up the user ID of a process in /proc/${pid/}status. The Uid: line is present in +// /proc/${pid}/status since at least kernel v2.5. +static int uid_from_pid(int pid) +{ + int uid = 0; + std::string path = StringPrintf("/proc/%d/status", pid); + FILE* f = fopen(path.c_str(), "r"); + if (!f) { + return uid; + } + char line[256]; + while (fgets(line, sizeof(line), f)) { + if (sscanf(line, "Uid: %d", &uid) == 1) { + break; + } + } + fclose(f); + return uid; +} + void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jint grp) { ALOGV("%s pid=%d grp=%" PRId32, __func__, pid, grp); @@ -275,7 +297,8 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin } } - if (!SetProcessProfilesCached(0, pid, {get_cpuset_policy_profile_name((SchedPolicy)grp)})) + if (!SetProcessProfilesCached(uid_from_pid(pid), pid, + {get_cpuset_policy_profile_name((SchedPolicy)grp)})) signalExceptionForGroupError(env, errno ? errno : EPERM, pid); } |