Module: wine Branch: master Commit: 72241b5d47ddd5a4373f206502e876e7ef13683d URL: http://source.winehq.org/git/wine.git/?a=commit;h=72241b5d47ddd5a4373f206502...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Sep 10 11:06:01 2009 +0200
ntdll: Make sure that serial ioctl calls fail on non-serial handles.
---
dlls/kernel32/tests/comm.c | 10 ++++++++++ dlls/ntdll/serial.c | 11 ++++++++++- 2 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/dlls/kernel32/tests/comm.c b/dlls/kernel32/tests/comm.c index 2fb95cd..3d0d17b 100644 --- a/dlls/kernel32/tests/comm.c +++ b/dlls/kernel32/tests/comm.c @@ -1643,6 +1643,15 @@ static void test_WaitBreak(HANDLE hcom) ok(ClearCommBreak(hcom), "ClearCommBreak failed\n"); }
+static void test_stdio(void) +{ + DCB dcb; + + /* cygwin tries this to determine the stdin handle type */ + ok( !GetCommState( GetStdHandle(STD_INPUT_HANDLE), &dcb ), "GetCommState succeeded on stdin\n" ); + ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %u\n", GetLastError() ); +} + START_TEST(comm) { HANDLE hcom; @@ -1735,4 +1744,5 @@ START_TEST(comm) test_WaitBreak(hcom); CloseHandle(hcom); } + test_stdio(); } diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index 2aff6fc..1936428 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -1110,8 +1110,17 @@ static inline NTSTATUS io_control(HANDLE hDevice,
if (dwIoControlCode != IOCTL_SERIAL_GET_TIMEOUTS && dwIoControlCode != IOCTL_SERIAL_SET_TIMEOUTS) - if ((status = server_get_unix_fd( hDevice, access, &fd, &needs_close, NULL, NULL ))) + { + enum server_fd_type type; + if ((status = server_get_unix_fd( hDevice, access, &fd, &needs_close, &type, NULL ))) + goto error; + if (type != FD_TYPE_SERIAL) + { + if (needs_close) close( fd ); + status = STATUS_OBJECT_TYPE_MISMATCH; goto error; + } + }
switch (dwIoControlCode) {