]> code.delx.au - gnu-emacs/commitdiff
Fix TLS connections on MS-Windows
authorEli Zaretskii <eliz@gnu.org>
Sun, 28 Feb 2016 16:44:50 +0000 (18:44 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sun, 28 Feb 2016 16:44:50 +0000 (18:44 +0200)
* src/w32.c (sys_write): If 'send' returns with WSAENOTCONN, and
this is a non-blocking socket whose connection is in progress, set
errno to EWOULDBLOCK, as expected by GnuTLS and other callers.
Avoid overwriting the errno value from 'send' by 'ioctlsocket'.
Suggested by Alain Schneble <a.s@realize.ch>.  (Bug#22789)

src/w32.c

index d298f47ae9954e868a48646ca7d0262c9e0dac37..998f696bdf8fe64d849a879892033bf9dded8b15 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -8654,6 +8654,19 @@ sys_write (int fd, const void * buffer, unsigned int count)
 
       nchars =  pfn_send (SOCK_HANDLE (fd), buffer, count, 0);
 
+      if (nchars == SOCKET_ERROR)
+        {
+         set_errno ();
+         /* If this is a non-blocking socket whose connection is in
+            progress, return the proper error code to the caller;
+            ENOTCONN is not what they expect . */
+         if (errno == ENOTCONN && (fd_info[fd].flags & FILE_CONNECT) != 0)
+           errno = EWOULDBLOCK;
+         else
+           DebPrint (("sys_write.send failed with error %d on socket %ld\n",
+                      pfn_WSAGetLastError (), SOCK_HANDLE (fd)));
+       }
+
       /* Set the socket back to non-blocking if it was before,
         for other operations that support it.  */
       if (fd_info[fd].flags & FILE_NDELAY)
@@ -8661,13 +8674,6 @@ sys_write (int fd, const void * buffer, unsigned int count)
          nblock = 1;
          pfn_ioctlsocket (SOCK_HANDLE (fd), FIONBIO, &nblock);
        }
-
-      if (nchars == SOCKET_ERROR)
-        {
-         DebPrint (("sys_write.send failed with error %d on socket %ld\n",
-                    pfn_WSAGetLastError (), SOCK_HANDLE (fd)));
-         set_errno ();
-       }
     }
   else
     {