From 5ca286666a0cd71436a84797d5d66831790004e0 Mon Sep 17 00:00:00 2001 From: "Erik M. Bray" Date: Thu, 15 Jun 2017 15:30:08 +0200 Subject: [PATCH] Ensure that send() interrupted by a signal returns sucessfully When SA_RESTART is not set on a socket, a blocking send() that is interrupted mid-transition by a signal should return success (and report just how many bytes were actually transmitted). The err variable used here was not always guaranteed to be set correctly in the loop, so better to just remove it and call WSAGetLastError() explicitly. --- winsup/cygwin/fhandler_socket.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index f3d1d6925..7a6dbdc41 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -1769,7 +1769,7 @@ inline ssize_t fhandler_socket::send_internal (struct _WSAMSG *wsamsg, int flags) { ssize_t res = 0; - DWORD ret = 0, err = 0, sum = 0; + DWORD ret = 0, sum = 0; WSABUF out_buf[wsamsg->dwBufferCount]; bool use_sendmsg = false; DWORD wait_flags = flags & MSG_DONTWAIT; @@ -1830,14 +1830,14 @@ fhandler_socket::send_internal (struct _WSAMSG *wsamsg, int flags) res = WSASendTo (get_socket (), wsamsg->lpBuffers, wsamsg->dwBufferCount, &ret, flags, wsamsg->name, wsamsg->namelen, NULL, NULL); - if (res && (err = WSAGetLastError ()) == WSAEWOULDBLOCK) + if (res && (WSAGetLastError () == WSAEWOULDBLOCK)) { LOCK_EVENTS; wsock_events->events &= ~FD_WRITE; UNLOCK_EVENTS; } } - while (res && err == WSAEWOULDBLOCK + while (res && (WSAGetLastError () == WSAEWOULDBLOCK) && !(res = wait_for_events (FD_WRITE | FD_CLOSE, wait_flags))); if (!res) @@ -1851,7 +1851,7 @@ fhandler_socket::send_internal (struct _WSAMSG *wsamsg, int flags) if (get_socket_type () != SOCK_STREAM || ret < out_len) break; } - else if (is_nonblocking () || err != WSAEWOULDBLOCK) + else if (is_nonblocking () || WSAGetLastError() != WSAEWOULDBLOCK) break; }