[PATCH 1/4 version2] kernel32: add test for WaitForSingleObject with lower 2 bits of handles set
Peter Oberndorfer
kumbayo84 at arcor.de
Wed Sep 22 14:06:22 CDT 2010
---
while writing tests for another function that uses WaitForXXXObject inside
i noticed feeding invalid handles like 0xdeabeef with the lower 2 bits set
produce strance results
Thanks to Paul Vriens for feedback.
Check for Win98 by looking at return value of CreateEventW.
I still use win_skip since on wine CreateEventW is supposed to always work.
Tested on win98, XP and wine(in XP and 98 mode)
On wine in win98 mode 2 unrelated tests fail
sync.c:156: Test succeeded inside todo block: ReleaseMutex failed with error 0
sync.c:158: Test succeeded inside todo block: ReleaseMutex should have failed with ERROR_NOT_OWNER instead of 288
Patches 2-4 still apply on top of this one.
dlls/kernel32/tests/sync.c | 89 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 89 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/tests/sync.c b/dlls/kernel32/tests/sync.c
index ea36fc6..99f7d24 100644
--- a/dlls/kernel32/tests/sync.c
+++ b/dlls/kernel32/tests/sync.c
@@ -939,6 +939,94 @@ static void test_timer_queue(void)
GetLastError());
}
+static HANDLE modify_handle(HANDLE handle, DWORD modify)
+{
+ DWORD tmp = HandleToULong(handle);
+ tmp |= modify;
+ return ULongToHandle(tmp);
+}
+
+static void test_WaitForSingleObject(void)
+{
+ HANDLE signaled, nonsignaled, invalid;
+ DWORD ret;
+
+ signaled = CreateEventW(NULL, TRUE, TRUE, NULL);
+ if(signaled == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
+ {
+ win_skip("Handles work differently on win9x\n");
+ return;
+ }
+ nonsignaled = CreateEventW(NULL, TRUE, FALSE, NULL);
+ invalid = (HANDLE) 0xdeadbee0;
+
+ /* invalid handle with different values for lower 2 bits */
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(invalid, 0);
+ ok(ret == WAIT_FAILED, "expected WAIT_FAILED, got %d\n", ret);
+ ok(GetLastError() == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(modify_handle(invalid, 1), 0);
+ ok(ret == WAIT_FAILED, "expected WAIT_FAILED, got %d\n", ret);
+ ok(GetLastError() == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(modify_handle(invalid, 2), 0);
+ ok(ret == WAIT_FAILED, "expected WAIT_FAILED, got %d\n", ret);
+ ok(GetLastError() == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(modify_handle(invalid, 3), 0);
+ todo_wine ok(ret == WAIT_FAILED, "expected WAIT_FAILED, got %d\n", ret);
+ ok(GetLastError() == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
+
+ /* valid handle with different values for lower 2 bits */
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(nonsignaled, 0);
+ ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %d\n", ret);
+ ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(modify_handle(nonsignaled, 1), 0);
+ ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %d\n", ret);
+ ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(modify_handle(nonsignaled, 2), 0);
+ ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %d\n", ret);
+ ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(modify_handle(nonsignaled, 3), 0);
+ todo_wine ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %d\n", ret);
+ todo_wine ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError());
+
+ /* valid handle with different values for lower 2 bits */
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(signaled, 0);
+ ok(ret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %d\n", ret);
+ ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(modify_handle(signaled, 1), 0);
+ ok(ret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %d\n", ret);
+ ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(modify_handle(signaled, 2), 0);
+ ok(ret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %d\n", ret);
+ ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = WaitForSingleObject(modify_handle(signaled, 3), 0);
+ ok(ret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %d\n", ret);
+ todo_wine ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError());
+
+ CloseHandle(signaled);
+ CloseHandle(nonsignaled);
+}
+
START_TEST(sync)
{
HMODULE hdll = GetModuleHandle("kernel32");
@@ -958,4 +1046,5 @@ START_TEST(sync)
test_waitable_timer();
test_iocp_callback();
test_timer_queue();
+ test_WaitForSingleObject();
}
--
1.7.0.4
More information about the wine-patches
mailing list