Module: wine Branch: master Commit: 5a6d38c2bd6032c10f00754d456b7b975e4c4b0f URL: http://source.winehq.org/git/wine.git/?a=commit;h=5a6d38c2bd6032c10f00754d45...
Author: André Hentschel nerv@dawncrow.de Date: Sat Dec 21 20:33:47 2013 +0100
kernel32: Adapt input checking in OpenConsoleW to match win8 behaviour.
---
dlls/kernel32/console.c | 10 +----- dlls/kernel32/tests/console.c | 70 +++++++++++++++++++++++++++++----------- 2 files changed, 52 insertions(+), 28 deletions(-)
diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c index 4f0ed09..67c353b 100644 --- a/dlls/kernel32/console.c +++ b/dlls/kernel32/console.c @@ -382,19 +382,11 @@ HANDLE WINAPI OpenConsoleW(LPCWSTR name, DWORD access, BOOL inherit, DWORD creat output = (HANDLE) TRUE; }
- if (output == INVALID_HANDLE_VALUE) + if (output == INVALID_HANDLE_VALUE || creation != OPEN_EXISTING) { SetLastError(ERROR_INVALID_PARAMETER); return INVALID_HANDLE_VALUE; } - else if (creation != OPEN_EXISTING) - { - if (!creation || creation == CREATE_NEW || creation == CREATE_ALWAYS) - SetLastError(ERROR_SHARING_VIOLATION); - else - SetLastError(ERROR_INVALID_PARAMETER); - return INVALID_HANDLE_VALUE; - }
SERVER_START_REQ( open_console ) { diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index d38315f..547e1c0 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -1062,39 +1062,60 @@ static void test_OpenConsoleW(void) DWORD gle, gle2; } invalid_table[] = { {NULL, 0, FALSE, 0, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, - {NULL, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, + {NULL, 0, FALSE, 0xdeadbeef, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, + {NULL, 0xdeadbeef, FALSE, 0, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, + {NULL, 0xdeadbeef, TRUE, 0xdeadbeef, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, {NULL, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, {NULL, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, {NULL, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, {NULL, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, {emptyW, 0, FALSE, 0, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, - {emptyW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, + {emptyW, 0, FALSE, 0xdeadbeef, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, + {emptyW, 0xdeadbeef, FALSE, 0, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, + {emptyW, 0xdeadbeef, TRUE, 0xdeadbeef, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, {emptyW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, {emptyW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, {emptyW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, {emptyW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING, ERROR_INVALID_PARAMETER, ERROR_PATH_NOT_FOUND}, {invalidW, 0, FALSE, 0, ERROR_INVALID_PARAMETER, ERROR_FILE_NOT_FOUND}, - {invalidW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER, 0}, + {invalidW, 0, FALSE, 0xdeadbeef, ERROR_INVALID_PARAMETER, 0}, + {invalidW, 0xdeadbeef, FALSE, 0, ERROR_INVALID_PARAMETER, ERROR_FILE_NOT_FOUND}, + {invalidW, 0xdeadbeef, TRUE, 0xdeadbeef, ERROR_INVALID_PARAMETER, 0}, {invalidW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER, ERROR_FILE_NOT_FOUND}, {invalidW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_INVALID_PARAMETER, ERROR_FILE_NOT_FOUND}, {invalidW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER, ERROR_FILE_NOT_FOUND}, {invalidW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING, ERROR_INVALID_PARAMETER, ERROR_FILE_NOT_FOUND}, - {coninW, 0, FALSE, 0, ERROR_SHARING_VIOLATION, 0}, - {coninW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER, 0}, - {coninW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER, 0}, - {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_SHARING_VIOLATION, 0}, - {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_NEW, ERROR_SHARING_VIOLATION, 0}, - {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_ALWAYS, ERROR_SHARING_VIOLATION, 0}, - {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER, 0}, - {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, TRUNCATE_EXISTING, ERROR_INVALID_PARAMETER, 0}, - {conoutW, 0, FALSE, 0, ERROR_SHARING_VIOLATION, 0}, - {conoutW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER, 0}, - {conoutW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER, 0}, - {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_SHARING_VIOLATION, 0}, - {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_NEW, ERROR_SHARING_VIOLATION, 0}, - {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_ALWAYS, ERROR_SHARING_VIOLATION, 0}, - {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER, 0}, - {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, TRUNCATE_EXISTING, ERROR_INVALID_PARAMETER, 0}, + {coninW, 0, FALSE, 0xdeadbeef, ERROR_INVALID_PARAMETER, 0}, + {coninW, 0xdeadbeef, FALSE, 0, ERROR_INVALID_PARAMETER, ERROR_ACCESS_DENIED}, + {coninW, 0xdeadbeef, TRUE, 0xdeadbeef, ERROR_INVALID_PARAMETER, 0}, + {conoutW, 0, FALSE, 0xdeadbeef, ERROR_INVALID_PARAMETER, 0}, + {conoutW, 0xceadbeef, FALSE, 0, ERROR_INVALID_PARAMETER, ERROR_ACCESS_DENIED}, + {conoutW, 0xdeadbeef, TRUE, 0xdeadbeef, ERROR_INVALID_PARAMETER, 0}, + }; + static const struct + { + LPCWSTR name; + DWORD access; + BOOL inherit; + DWORD creation; + } valid_table[] = { + {coninW, 0, FALSE, 0 }, + {coninW, 0, TRUE, 0 }, + {coninW, GENERIC_EXECUTE, TRUE, 0 }, + {coninW, GENERIC_ALL, TRUE, 0 }, + {coninW, 0, FALSE, OPEN_ALWAYS }, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, 0 }, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_NEW }, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_ALWAYS }, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS }, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, TRUNCATE_EXISTING}, + {conoutW, 0, FALSE, 0 }, + {conoutW, 0, FALSE, OPEN_ALWAYS }, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, 0 }, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_NEW, }, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_ALWAYS }, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS }, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, TRUNCATE_EXISTING}, };
int index; @@ -1120,6 +1141,17 @@ static void test_OpenConsoleW(void) invalid_table[index].gle, invalid_table[index].gle2, index, gle); }
+ for (index = 0; index < sizeof(valid_table)/sizeof(valid_table[0]); index++) + { + ret = pOpenConsoleW(valid_table[index].name, valid_table[index].access, + valid_table[index].inherit, valid_table[index].creation); + todo_wine + ok(ret != INVALID_HANDLE_VALUE || broken(ret == INVALID_HANDLE_VALUE /* until Win7 */), + "Expected OpenConsoleW to succeed for index %d, got %p\n", index, ret); + if (ret != INVALID_HANDLE_VALUE) + CloseHandle(ret); + } + /* OpenConsoleW should not touch the last error on success. */ SetLastError(0xdeadbeef); ret = pOpenConsoleW(coninW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING);