From d77304ac209d6ef7ea72e46ba2d9f971f8a6d40b Mon Sep 17 00:00:00 2001 From: corinna Date: Mon, 6 Jul 2009 20:30:33 +0000 Subject: [PATCH] * fhandler_socket.cc (fhandler_socket::recv_internal): Convert wsabuf and wsacnt to references. Fix handling of WSAEMSGSIZE. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/fhandler_socket.cc | 23 +++++++++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 4a16d36abd..b731ef1811 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,10 @@ 2009-07-06 Corinna Vinschen + * fhandler_socket.cc (fhandler_socket::recv_internal): Convert wsabuf + and wsacnt to references. Fix handling of WSAEMSGSIZE. + +2009-07-06 Corinna Vinschen + * cygtls.h (struct _local_storage): Add thread storage pointers for memory used by socket select functions. Combine them into a single struct select. diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index ea057d6999..bd6a2fb311 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; -- 2.11.0