Any chance anyone could look over this? ---------- Forwarded message ---------- From: Matt Jones <[EMAIL PROTECTED]> Date: Jul 20, 2007 11:33 AM Subject: server: Only commit SetThreadPriority if new priority is correct (try 4) To: [EMAIL PROTECTED]
Correctly set error value as per comment by Alexandre, also integrate comments from Rob Shearman
From ae2ea6f68235f706325d1d6df6350b2e17107fc3 Mon Sep 17 00:00:00 2001 From: Matt Jones <[EMAIL PROTECTED]> Date: Fri, 20 Jul 2007 11:30:33 -0700 Subject: [PATCH] server: Only commit SetThreadPriority if new priority is correct, try 4 Set correct error message (STATUS_INVALID_PARAMETER) if the new thread priority is invalid Integrated comments from Rob Shearman and Alexandre Julliard --- dlls/kernel32/tests/thread.c | 20 ++++++++------------ server/thread.c | 21 ++++++++++++++++++++- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c index ff53d2e..ca172d6 100644 --- a/dlls/kernel32/tests/thread.c +++ b/dlls/kernel32/tests/thread.c @@ -594,23 +594,19 @@ #endif SetThreadPriority(curthread,min_priority-1); exitCode = GetLastError(); - todo_wine { - ok(exitCode == ERROR_INVALID_PARAMETER, - "SetThreadPriority error %d, expected ERROR_INVALID_PARAMETER (87)", exitCode); - ok(GetThreadPriority(curthread)==min_priority, - "GetThreadPriority didn't return min_priority\n"); - } + ok(exitCode == ERROR_INVALID_PARAMETER, + "SetThreadPriority error %d, expected ERROR_INVALID_PARAMETER (87)", exitCode); + ok(GetThreadPriority(curthread)==min_priority, + "GetThreadPriority didn't return min_priority\n"); SetThreadPriority(curthread,max_priority); SetThreadPriority(curthread,max_priority+1); SetThreadPriority(curthread,min_priority-1); exitCode = GetLastError(); - todo_wine { - ok(exitCode == ERROR_INVALID_PARAMETER, - "SetThreadPriority error %d, expected ERROR_INVALID_PARAMETER (87)", exitCode); - ok(GetThreadPriority(curthread)==max_priority, - "GetThreadPriority didn't return max_priority\n"); - } + ok(exitCode == ERROR_INVALID_PARAMETER, + "SetThreadPriority error %d, expected ERROR_INVALID_PARAMETER (87)", exitCode); + ok(GetThreadPriority(curthread)==max_priority, + "GetThreadPriority didn't return max_priority\n"); /* Check thread priority boost */ if (!pGetThreadPriorityBoost || !pSetThreadPriorityBoost) diff --git a/server/thread.c b/server/thread.c index 62d50b5..b798ec5 100644 --- a/server/thread.c +++ b/server/thread.c @@ -383,12 +383,31 @@ struct thread *get_thread_from_pid( int return NULL; } +#define THREAD_PRIORITY_REALTIME_HIGHEST 6 +#define THREAD_PRIORITY_REALTIME_LOWEST -7 + /* set all information about a thread */ static void set_thread_info( struct thread *thread, const struct set_thread_info_request *req ) { if (req->mask & SET_THREAD_INFO_PRIORITY) - thread->priority = req->priority; + { + int max = THREAD_PRIORITY_HIGHEST; + int min = THREAD_PRIORITY_LOWEST; + if (thread->process->priority == PROCESS_PRIOCLASS_REALTIME) + { + max = THREAD_PRIORITY_REALTIME_HIGHEST; + min = THREAD_PRIORITY_REALTIME_LOWEST; + } + + if ((req->priority >= min || + req->priority == THREAD_PRIORITY_IDLE) && + (req->priority <= max || + req->priority == THREAD_PRIORITY_TIME_CRITICAL)) + thread->priority = req->priority; + else + set_error( STATUS_INVALID_PARAMETER ); + } if (req->mask & SET_THREAD_INFO_AFFINITY) { if (req->affinity != 1) set_error( STATUS_INVALID_PARAMETER ); -- 1.4.1