Module: wine Branch: master Commit: d3f09b862a3f6b19bbfeba7183c2ced06c030f72 URL: https://source.winehq.org/git/wine.git/?a=commit;h=d3f09b862a3f6b19bbfeba718...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Oct 14 19:57:51 2020 +0200
console: Don't allow blocking read ioctls on screen buffer object.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49997 Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/tests/console.c | 18 ++++++++++++++++++ server/console.c | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index da62fd3eb2..ddd5bfcb4c 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -2981,6 +2981,7 @@ static void test_ReadConsole(HANDLE input) { DWORD ret, bytes; char buf[1024]; + HANDLE output;
SetLastError(0xdeadbeef); ret = GetFileSize(input, NULL); @@ -3015,6 +3016,23 @@ static void test_ReadConsole(HANDLE input) GetLastError() == ERROR_NOACCESS, /* Win 8, 10 */ "expected ERROR_NOT_ENOUGH_MEMORY, got %d\n", GetLastError()); ok(bytes == 0xdeadbeef, "expected 0xdeadbeef, got %#x\n", bytes); + + output = CreateFileA("CONOUT$", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + ok(output != INVALID_HANDLE_VALUE, "Could not open console\n"); + + ret = ReadConsoleW(output, buf, sizeof(buf) / sizeof(WCHAR), &bytes, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_HANDLE, + "ReadConsoleW returned %x(%u)\n", ret, GetLastError()); + + ret = ReadConsoleA(output, buf, sizeof(buf), &bytes, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_HANDLE, + "ReadConsoleA returned %x(%u)\n", ret, GetLastError()); + + ret = ReadFile(output, buf, sizeof(buf), &bytes, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_HANDLE, + "ReadFile returned %x(%u)\n", ret, GetLastError()); + + CloseHandle(output); }
static void test_GetCurrentConsoleFont(HANDLE std_output) diff --git a/server/console.c b/server/console.c index 184d98d166..8ac3a08abc 100644 --- a/server/console.c +++ b/server/console.c @@ -848,7 +848,8 @@ static int screen_buffer_ioctl( struct fd *fd, ioctl_code_t code, struct async * return 1;
default: - if (!screen_buffer->input || !screen_buffer->input->server || code >> 16 != FILE_DEVICE_CONSOLE) + if (!screen_buffer->input || !screen_buffer->input->server || code >> 16 != FILE_DEVICE_CONSOLE || + is_blocking_read_ioctl( code )) { set_error( STATUS_INVALID_HANDLE ); return 0;