Akihiro Sagawa : ws2_32: Fix ioctlsocket(FIONREAD) with listening socket.

Alexandre Julliard julliard at winehq.org
Tue Feb 27 17:29:34 CST 2018


Module: wine
Branch: master
Commit: f6b6c94add5991279828d07f45c6abb4f9f2a74e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f6b6c94add5991279828d07f45c6abb4f9f2a74e

Author: Akihiro Sagawa <sagawa.aki at 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 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at 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);
 




More information about the wine-cvs mailing list