Module: wine Branch: master Commit: f6b6c94add5991279828d07f45c6abb4f9f2a74e URL: https://source.winehq.org/git/wine.git/?a=commit;h=f6b6c94add5991279828d07f4...
Author: Akihiro Sagawa sagawa.aki@gmail.com Date: Sun Feb 25 15:01:05 2018 +0900
ws2_32: Fix ioctlsocket(FIONREAD) with listening socket.
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ws2_32/socket.c | 12 ++++++++++++ dlls/ws2_32/tests/sock.c | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index d983633..25ec72a 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -4648,12 +4648,24 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
case WS_FIONREAD: { +#if defined(linux) + int listening = 0; + socklen_t len = sizeof(listening); +#endif if (out_size != sizeof(WS_u_long) || IS_INTRESOURCE(out_buff)) { SetLastError(WSAEFAULT); return SOCKET_ERROR; } if ((fd = get_sock_fd( s, 0, NULL )) == -1) return SOCKET_ERROR; + +#if defined(linux) + /* On Linux, FIONREAD on listening socket always fails (see tcp(7)). + However, it succeeds on native. */ + if (!getsockopt( fd, SOL_SOCKET, SO_ACCEPTCONN, &listening, &len ) && listening) + (*(WS_u_long *) out_buff) = 0; + else +#endif if (ioctl(fd, FIONREAD, out_buff ) == -1) status = wsaErrno(); release_sock_fd( s, fd ); diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 06ba3f0..05495b4 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -5233,8 +5233,8 @@ static void test_ioctlsocket(void) /* test FIONREAD with listening socket */ arg = 0xdeadbeef; ret = ioctlsocket(sock, FIONREAD, &arg); - todo_wine ok(ret == 0, "ioctlsocket failed unexpectedly with error %d\n", WSAGetLastError()); - todo_wine ok(arg == 0, "expected 0, got %u\n", arg); + ok(ret == 0, "ioctlsocket failed unexpectedly with error %d\n", WSAGetLastError()); + ok(arg == 0, "expected 0, got %u\n", arg);
closesocket(sock);