summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_socket.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r--winsup/cygwin/fhandler_socket.cc23
1 files changed, 13 insertions, 10 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index ea057d699..bd6a2fb31 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -1309,8 +1309,8 @@ fhandler_socket::recv_internal (LPWSAMSG wsamsg)
ssize_t res = 0;
DWORD ret = 0, wret;
int evt_mask = FD_READ | ((wsamsg->dwFlags & MSG_OOB) ? FD_OOB : 0);
- LPWSABUF wsabuf = wsamsg->lpBuffers;
- ULONG wsacnt = wsamsg->dwBufferCount;
+ LPWSABUF &wsabuf = wsamsg->lpBuffers;
+ ULONG &wsacnt = wsamsg->dwBufferCount;
bool use_recvmsg = false;
static NO_COPY LPFN_WSARECVMSG WSARecvMsg;
@@ -1383,20 +1383,23 @@ fhandler_socket::recv_internal (LPWSAMSG wsamsg)
break;
}
- if (!ret && res == SOCKET_ERROR)
+ if (res)
{
/* According to SUSv3, errno isn't set in that case and no error
condition is returned. */
if (WSAGetLastError () == WSAEMSGSIZE)
- return ret;
+ return ret + wret;
- /* ESHUTDOWN isn't defined for recv in SUSv3. Simply EOF is returned
- in this case. */
- if (WSAGetLastError () == WSAESHUTDOWN)
- return 0;
+ if (!ret)
+ {
+ /* ESHUTDOWN isn't defined for recv in SUSv3. Simply EOF is returned
+ in this case. */
+ if (WSAGetLastError () == WSAESHUTDOWN)
+ return 0;
- set_winsock_errno ();
- return SOCKET_ERROR;
+ set_winsock_errno ();
+ return SOCKET_ERROR;
+ }
}
return ret;