Module: wine Branch: oldstable Commit: 853e970d2b33a7f1a76abcc780ea7c9b67f0bc75 URL: https://source.winehq.org/git/wine.git/?a=commit;h=853e970d2b33a7f1a76abcc78...
Author: Roger Zoellner zoellner.roger@gmail.com Date: Tue Sep 11 02:41:09 2018 +0200
ntdll: Relax checks for valid affinity mask in NtSetInformationThread().
Signed-off-by: Roger Zoellner zoellner.roger@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 575c1c9066f353fdd6b9fb770c110705c4ddd6c5) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/ntdll/tests/info.c | 21 +++++++++++++++++++++ dlls/ntdll/thread.c | 7 +++---- 2 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index b62e035..a84d1fc 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -1912,6 +1912,27 @@ static void test_affinity(void) ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status); ok( tbi.AffinityMask == 1, "Unexpected thread affinity\n" );
+ /* NOTE: Pre-Vista does not allow bits to be set that are higher than the highest set bit in process affinity mask */ + thread_affinity = (pbi.AffinityMask << 1) | pbi.AffinityMask; + status = pNtSetInformationThread( GetCurrentThread(), ThreadAffinityMask, &thread_affinity, sizeof(thread_affinity) ); + ok( broken(status == STATUS_INVALID_PARAMETER) || (status == STATUS_SUCCESS), "Expected STATUS_SUCCESS, got %08x\n", status ); + if (status == STATUS_SUCCESS) + { + status = pNtQueryInformationThread( GetCurrentThread(), ThreadBasicInformation, &tbi, sizeof(tbi), NULL ); + ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status ); + ok( tbi.AffinityMask == pbi.AffinityMask, "Unexpected thread affinity. Expected %lx, got %lx\n", pbi.AffinityMask, tbi.AffinityMask ); + } + + thread_affinity = ~(DWORD_PTR)0 - 1; + status = pNtSetInformationThread( GetCurrentThread(), ThreadAffinityMask, &thread_affinity, sizeof(thread_affinity) ); + ok( broken(status == STATUS_INVALID_PARAMETER) || (status == STATUS_SUCCESS), "Expected STATUS_SUCCESS, got %08x\n", status ); + if (status == STATUS_SUCCESS) + { + status = pNtQueryInformationThread( GetCurrentThread(), ThreadBasicInformation, &tbi, sizeof(tbi), NULL ); + ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status ); + ok( tbi.AffinityMask == (pbi.AffinityMask & (~(DWORD_PTR)0 - 1)), "Unexpected thread affinity. Expected %lx, got %lx\n", pbi.AffinityMask & (~(DWORD_PTR)0 - 1), tbi.AffinityMask ); + } + /* NOTE: Pre-Vista does not recognize the "all processors" flag (all bits set) */ thread_affinity = ~(DWORD_PTR)0; status = pNtSetInformationThread( GetCurrentThread(), ThreadAffinityMask, &thread_affinity, sizeof(thread_affinity) ); diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 88008ad..9b8a9b7 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -1286,10 +1286,9 @@ NTSTATUS WINAPI NtSetInformationThread( HANDLE handle, THREADINFOCLASS class, ULONG_PTR req_aff;
if (length != sizeof(ULONG_PTR)) return STATUS_INVALID_PARAMETER; - req_aff = *(const ULONG_PTR *)data; - if ((ULONG)req_aff == ~0u) req_aff = affinity_mask; - else if (req_aff & ~affinity_mask) return STATUS_INVALID_PARAMETER; - else if (!req_aff) return STATUS_INVALID_PARAMETER; + req_aff = *(const ULONG_PTR *)data & affinity_mask; + if (!req_aff) return STATUS_INVALID_PARAMETER; + SERVER_START_REQ( set_thread_info ) { req->handle = wine_server_obj_handle( handle );