summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2016-02-28 18:44:50 +0200
committerEli Zaretskii <eliz@gnu.org>2016-02-28 18:44:50 +0200
commit9295d0a8c2078e5b85bc81b1f020cc73793767df (patch)
treee6fa5e45bb97e6d9312fff80fd42f9e059897236
parentcd6067965761ccf31c48a106596b5187e85120e1 (diff)
downloademacs-9295d0a8c2078e5b85bc81b1f020cc73793767df.tar.gz
Fix TLS connections on MS-Windows
* 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)
-rw-r--r--src/w32.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/w32.c b/src/w32.c
index d298f47ae99..998f696bdf8 100644
--- 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
{