From 4c0c4df7cfa0b4228ef547aa940674393cb2ab77 Mon Sep 17 00:00:00 2001 From: Ruben Brunk Date: Tue, 9 Aug 2016 12:46:13 -0700 Subject: [PATCH] Include tids in android.util.Process exceptions. Bug: 30746129 Change-Id: Id90a40b9df68a8d590bb864546c1bbc9c0edd916 --- core/jni/android_util_Process.cpp | 76 ++++++++++++++++--------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index a693f29aa283d..3c72274f1fcaf 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -58,21 +58,19 @@ static pthread_key_t gBgKey = -1; #endif // For both of these, err should be in the errno range (positive), not a status_t (negative) - -static void signalExceptionForPriorityError(JNIEnv* env, int err) -{ +static void signalExceptionForError(JNIEnv* env, int err, int tid) { switch (err) { case EINVAL: - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); + jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", + "Invalid argument: %d", tid); break; case ESRCH: - jniThrowException(env, "java/lang/IllegalArgumentException", "Given thread does not exist"); + jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", + "Given thread %d does not exist", tid); break; case EPERM: - jniThrowException(env, "java/lang/SecurityException", "No permission to modify given thread"); - break; - case EACCES: - jniThrowException(env, "java/lang/SecurityException", "No permission to set to given priority"); + jniThrowExceptionFmt(env, "java/lang/SecurityException", + "No permission to modify given thread %d", tid); break; default: jniThrowException(env, "java/lang/RuntimeException", "Unknown error"); @@ -80,23 +78,27 @@ static void signalExceptionForPriorityError(JNIEnv* env, int err) } } -static void signalExceptionForGroupError(JNIEnv* env, int err) -{ +static void signalExceptionForPriorityError(JNIEnv* env, int err, int tid) { switch (err) { - case EINVAL: - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - break; - case ESRCH: - jniThrowException(env, "java/lang/IllegalArgumentException", "Given thread does not exist"); - break; - case EPERM: - jniThrowException(env, "java/lang/SecurityException", "No permission to modify given thread"); - break; case EACCES: - jniThrowException(env, "java/lang/SecurityException", "No permission to set to given group"); + jniThrowExceptionFmt(env, "java/lang/SecurityException", + "No permission to set the priority of %d", tid); break; default: - jniThrowException(env, "java/lang/RuntimeException", "Unknown error"); + signalExceptionForError(env, err, tid); + break; + } + +} + +static void signalExceptionForGroupError(JNIEnv* env, int err, int tid) { + switch (err) { + case EACCES: + jniThrowExceptionFmt(env, "java/lang/SecurityException", + "No permission to set the group of %d", tid); + break; + default: + signalExceptionForError(env, err, tid); break; } } @@ -171,7 +173,7 @@ void android_os_Process_setThreadGroup(JNIEnv* env, jobject clazz, int tid, jint SchedPolicy sp = (SchedPolicy) grp; int res = set_sched_policy(tid, sp); if (res != NO_ERROR) { - signalExceptionForGroupError(env, -res); + signalExceptionForGroupError(env, -res, tid); } } @@ -183,7 +185,7 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin struct dirent *de; if ((grp == SP_FOREGROUND) || (grp > SP_MAX)) { - signalExceptionForGroupError(env, EINVAL); + signalExceptionForGroupError(env, EINVAL, pid); return; } @@ -219,7 +221,7 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin if (!(d = opendir(proc_path))) { // If the process exited on us, don't generate an exception if (errno != ENOENT) - signalExceptionForGroupError(env, errno); + signalExceptionForGroupError(env, errno, pid); return; } @@ -254,7 +256,7 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin #ifdef ENABLE_CPUSETS int err = set_cpuset_policy(t_pid, sp); if (err != NO_ERROR) { - signalExceptionForGroupError(env, -err); + signalExceptionForGroupError(env, -err, t_pid); break; } #endif @@ -266,14 +268,14 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin // set both cpuset and cgroup for general threads err = set_cpuset_policy(t_pid, sp); if (err != NO_ERROR) { - signalExceptionForGroupError(env, -err); + signalExceptionForGroupError(env, -err, t_pid); break; } #endif err = set_sched_policy(t_pid, sp); if (err != NO_ERROR) { - signalExceptionForGroupError(env, -err); + signalExceptionForGroupError(env, -err, t_pid); break; } @@ -285,7 +287,7 @@ jint android_os_Process_getProcessGroup(JNIEnv* env, jobject clazz, jint pid) { SchedPolicy sp; if (get_sched_policy(pid, &sp) != 0) { - signalExceptionForGroupError(env, errno); + signalExceptionForGroupError(env, errno, pid); } return (int) sp; } @@ -400,7 +402,7 @@ jintArray android_os_Process_getExclusiveCores(JNIEnv* env, jobject clazz) { jintArray cpus; int pid = getpid(); if (get_sched_policy(pid, &sp) != 0) { - signalExceptionForGroupError(env, errno); + signalExceptionForGroupError(env, errno, pid); return NULL; } get_exclusive_cpuset_cores(sp, &cpu_set); @@ -449,10 +451,10 @@ jint android_os_Process_getThreadScheduler(JNIEnv* env, jclass clazz, errno = 0; policy = sched_getscheduler(tid); if (errno != 0) { - signalExceptionForPriorityError(env, errno); + signalExceptionForPriorityError(env, errno, tid); } #else - signalExceptionForPriorityError(env, ENOSYS); + signalExceptionForPriorityError(env, ENOSYS, tid); #endif return policy; } @@ -466,10 +468,10 @@ void android_os_Process_setThreadScheduler(JNIEnv* env, jclass clazz, param.sched_priority = pri; int rc = sched_setscheduler(tid, policy, ¶m); if (rc) { - signalExceptionForPriorityError(env, errno); + signalExceptionForPriorityError(env, errno, tid); } #else - signalExceptionForPriorityError(env, ENOSYS); + signalExceptionForPriorityError(env, ENOSYS, tid); #endif } @@ -494,9 +496,9 @@ void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz, int rc = androidSetThreadPriority(pid, pri); if (rc != 0) { if (rc == INVALID_OPERATION) { - signalExceptionForPriorityError(env, errno); + signalExceptionForPriorityError(env, errno, pid); } else { - signalExceptionForGroupError(env, errno); + signalExceptionForGroupError(env, errno, pid); } } @@ -516,7 +518,7 @@ jint android_os_Process_getThreadPriority(JNIEnv* env, jobject clazz, errno = 0; jint pri = getpriority(PRIO_PROCESS, pid); if (errno != 0) { - signalExceptionForPriorityError(env, errno); + signalExceptionForPriorityError(env, errno, pid); } //ALOGI("Returning priority of %" PRId32 ": %" PRId32 "\n", pid, pri); return pri;