Commit 7b63fa65 authored by Bernhard Loos's avatar Bernhard Loos Committed by Alexandre Julliard

server: Certain access flags are illegal for OpenMutex.

parent 97e621bd
...@@ -128,20 +128,51 @@ static void test_mutex(void) ...@@ -128,20 +128,51 @@ static void test_mutex(void)
BOOL ret; BOOL ret;
HANDLE hCreated; HANDLE hCreated;
HANDLE hOpened; HANDLE hOpened;
int i;
DWORD failed = 0;
hCreated = CreateMutex(NULL, FALSE, "WineTestMutex"); hCreated = CreateMutex(NULL, FALSE, "WineTestMutex");
ok(hCreated != NULL, "CreateMutex failed with error %d\n", GetLastError()); ok(hCreated != NULL, "CreateMutex failed with error %d\n", GetLastError());
wait_ret = WaitForSingleObject(hCreated, INFINITE);
ok(wait_ret == WAIT_OBJECT_0, "WaitForSingleObject failed with error 0x%08x\n", wait_ret);
/* yes, opening with just READ_CONTROL access allows us to successfully hOpened = OpenMutex(0, FALSE, "WineTestMutex");
* call ReleaseMutex */ ok(hOpened == NULL, "OpenMutex succeded\n");
hOpened = OpenMutex(READ_CONTROL, FALSE, "WineTestMutex");
hOpened = OpenMutex(GENERIC_EXECUTE, FALSE, "WineTestMutex");
ok(hOpened != NULL, "OpenMutex failed with error %d\n", GetLastError());
wait_ret = WaitForSingleObject(hOpened, INFINITE);
todo_wine ok(wait_ret == WAIT_OBJECT_0, "WaitForSingleObject failed with error %d\n", GetLastError());
CloseHandle(hOpened);
for(i=0; i < 31; i++)
{
wait_ret = WaitForSingleObject(hCreated, INFINITE);
ok(wait_ret == WAIT_OBJECT_0, "WaitForSingleObject failed with error 0x%08x\n", wait_ret);
}
hOpened = OpenMutex(GENERIC_READ | GENERIC_WRITE, FALSE, "WineTestMutex");
ok(hOpened != NULL, "OpenMutex failed with error %d\n", GetLastError()); ok(hOpened != NULL, "OpenMutex failed with error %d\n", GetLastError());
ret = ReleaseMutex(hOpened); wait_ret = WaitForSingleObject(hOpened, INFINITE);
todo_wine ok(ret, "ReleaseMutex failed with error %d\n", GetLastError()); todo_wine ok(wait_ret == WAIT_FAILED, "WaitForSingleObject succeeded\n");
CloseHandle(hOpened);
for (i = 0; i < 32; i++)
{
hOpened = OpenMutex(0x1 << i, FALSE, "WineTestMutex");
ReleaseMutex(hCreated);
if(hOpened != NULL)
{
CloseHandle(hOpened);
}
else
{
failed |=0x1 << i;
}
}
ok( failed == 0x0de0fffe, "open succeded when it shouldn't: %x\n", failed);
ret = ReleaseMutex(hCreated); ret = ReleaseMutex(hCreated);
todo_wine ok(!ret && (GetLastError() == ERROR_NOT_OWNER), ok(!ret && (GetLastError() == ERROR_NOT_OWNER),
"ReleaseMutex should have failed with ERROR_NOT_OWNER instead of %d\n", GetLastError()); "ReleaseMutex should have failed with ERROR_NOT_OWNER instead of %d\n", GetLastError());
/* test case sensitivity */ /* test case sensitivity */
......
...@@ -238,6 +238,14 @@ DECL_HANDLER(open_mutex) ...@@ -238,6 +238,14 @@ DECL_HANDLER(open_mutex)
struct directory *root = NULL; struct directory *root = NULL;
struct mutex *mutex; struct mutex *mutex;
if ((req->access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL |
MUTEX_ALL_ACCESS | STANDARD_RIGHTS_ALL | MAXIMUM_ALLOWED)) ||
!req->access)
{
set_error(STATUS_INVALID_PARAMETER);
return;
}
get_req_unicode_str( &name ); get_req_unicode_str( &name );
if (req->rootdir && !(root = get_directory_obj( current->process, req->rootdir, 0 ))) if (req->rootdir && !(root = get_directory_obj( current->process, req->rootdir, 0 )))
return; return;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment