diff options
| author | Eli Zaretskii <eliz@gnu.org> | 2016-02-28 18:44:50 +0200 |
|---|---|---|
| committer | Eli Zaretskii <eliz@gnu.org> | 2016-02-28 18:44:50 +0200 |
| commit | 9295d0a8c2078e5b85bc81b1f020cc73793767df (patch) | |
| tree | e6fa5e45bb97e6d9312fff80fd42f9e059897236 | |
| parent | cd6067965761ccf31c48a106596b5187e85120e1 (diff) | |
| download | emacs-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.c | 20 |
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 { |
