diff --git a/dll/win32/msafd/misc/dllmain.c b/dll/win32/msafd/misc/dllmain.c index a4cded75c00..9cd525ee09a 100644 --- a/dll/win32/msafd/misc/dllmain.c +++ b/dll/win32/msafd/misc/dllmain.c @@ -1495,22 +1495,25 @@ WSPAccept( ListenReceiveData = (PAFD_RECEIVED_ACCEPT_DATA)ReceiveBuffer; /* If this is non-blocking, make sure there's something for us to accept */ - FD_ZERO(&ReadSet); - FD_SET(Socket->Handle, &ReadSet); - Timeout.tv_sec=0; - Timeout.tv_usec=0; - - if (WSPSelect(0, &ReadSet, NULL, NULL, &Timeout, lpErrno) == SOCKET_ERROR) + if (Socket->SharedData->NonBlocking) { - NtClose(SockEvent); - return SOCKET_ERROR; - } + FD_ZERO(&ReadSet); + FD_SET(Socket->Handle, &ReadSet); + Timeout.tv_sec=0; + Timeout.tv_usec=0; - if (ReadSet.fd_array[0] != Socket->Handle) - { - NtClose(SockEvent); - if (lpErrno) *lpErrno = WSAEWOULDBLOCK; - return SOCKET_ERROR; + if (WSPSelect(0, &ReadSet, NULL, NULL, &Timeout, lpErrno) == SOCKET_ERROR) + { + NtClose(SockEvent); + return SOCKET_ERROR; + } + + if (ReadSet.fd_array[0] != Socket->Handle) + { + NtClose(SockEvent); + if (lpErrno) *lpErrno = WSAEWOULDBLOCK; + return SOCKET_ERROR; + } } /* Send IOCTL */ @@ -1783,6 +1786,9 @@ WSPAccept( AcceptSocketInfo->SharedData->State = SocketConnected; AcceptSocketInfo->SharedData->ConnectTime = GetCurrentTimeInSeconds(); + /* Inherit non-blocking state to new socket */ + AcceptSocketInfo->SharedData->NonBlocking = Socket->SharedData->NonBlocking; + /* Return Address in SOCKADDR FORMAT */ if( SocketAddress ) { diff --git a/dll/win32/msafd/misc/sndrcv.c b/dll/win32/msafd/misc/sndrcv.c index 07fe8b1f1c0..e36f44c7698 100644 --- a/dll/win32/msafd/misc/sndrcv.c +++ b/dll/win32/msafd/misc/sndrcv.c @@ -291,6 +291,13 @@ WSPRecv(SOCKET Handle, NULL, 0); + /* Non-blocking sockets must wait until data is available*/ + if (Status == STATUS_PENDING && Socket->SharedData->NonBlocking) + { + if (lpErrno) *lpErrno = WSAEWOULDBLOCK; + return SOCKET_ERROR; + } + /* Wait for completion of not overlapped */ if (Status == STATUS_PENDING && lpOverlapped == NULL) {