Jacek Caban : console: Don't allow blocking read ioctls on screen buffer object.
Alexandre Julliard
julliard at winehq.org
Wed Oct 14 15:37:21 CDT 2020
Module: wine
Branch: master
Commit: d3f09b862a3f6b19bbfeba7183c2ced06c030f72
URL: https://source.winehq.org/git/wine.git/?a=commit;h=d3f09b862a3f6b19bbfeba7183c2ced06c030f72
Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
More information about the wine-cvs
mailing list