]> sourceware.org Git - newlib-cygwin.git/commitdiff
Ensure that send() interrupted by a signal returns sucessfully
authorErik M. Bray <erik.m.bray@gmail.com>
Thu, 15 Jun 2017 13:30:08 +0000 (15:30 +0200)
committerCorinna Vinschen <corinna@vinschen.de>
Mon, 19 Jun 2017 10:51:39 +0000 (12:51 +0200)
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

index f3d1d692561609e08791622e5553a82cadc1348b..7a6dbdc41a41c248967f624f7e9385d0ba2346ca 100644 (file)
@@ -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;
     }
 
This page took 0.036211 seconds and 5 git commands to generate.