From: Alain Schneble <a.s@realize.ch>
To: Eli Zaretskii <eliz@gnu.org>
Cc: larsi@gnus.org, j_l_domenech@yahoo.com, 22789@debbugs.gnu.org
Subject: bug#22789: 25.1.50; In last master build https connections stop working
Date: Mon, 7 Mar 2016 23:21:56 +0100 [thread overview]
Message-ID: <86bn6qylmj.fsf@realize.ch> (raw)
In-Reply-To: <83mvqauv8l.fsf@gnu.org> (Eli Zaretskii's message of "Mon, 07 Mar 2016 18:07:54 +0200")
[-- Attachment #1: Type: text/plain, Size: 1817 bytes --]
Eli Zaretskii <eliz@gnu.org> writes:
> I think this change should be installed regardless, as it fixes an
> oversight. However, I think it needs to be augmented, because the
> fact that FILE_CONNECT flag is set doesn't necessarily mean the
> connection is in progress: it could have failed already. We need to
> look at the status as well.
>
> The possible states of the FILE_CONNECT flag and the cp->status values
> are:
>
> flag status description
> ----------------------------------------------------------------------------
> ON STATUS_READ_READY reader thread is about to try connect
> ON STATUS_READ_FAILED reader thread waits in _sys_wait_connect
> ON STATUS_READ_SUCCEEDED reader thread successfully connected
> ON STATUS_CONNECT_FAILED reader thread failed to connect
> OFF STATUS_READ_ACKNOWLEDGED sys_select acknowledged successful connect
> OFF STATUS_READ_READY reader thread is about to read
> OFF STATUS_READ_IN_PROGRESS reader thread waits in _sys_read_ahead
> OFF STATUS_READ_SUCCEEDED reader thread succeeded in reading
> OFF STATUS_READ_FAILED reader thread failed to read
>
> So we should only return EWOULDBLOCK when FILE_CONNECT is set _and_
> the status is not STATUS_CONNECT_FAILED. If FILE_CONNECT is set, but
> the status is STATUS_CONNECT_FAILED, we should instead return the
> value computed from cp->errcode (if it is non-zero). There's an
> example of that in sys_read.
Thank you very much for these inputs. I rearranged the patch to include
these two cases and removed another special case that should no longer
be needed as it is covered by the first one.
Is this what you had in mind? Do you agree with the change?
Thanks.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Patch --]
[-- Type: text/x-patch, Size: 2727 bytes --]
From 81295b036eb0a43dee968e8aa3f031030589cddd Mon Sep 17 00:00:00 2001
From: Alain Schneble <a.s@realize.ch>
Date: Mon, 7 Mar 2016 23:05:40 +0100
Subject: [PATCH] Resolve non-blocking socket connection issue on w32
* src/w32.c (sys_write): For non-blocking sockets, return immediately
with EWOULDBLOCK if connection is still in progress. If connection
attempt has failed already, return proper code stashed in cp->errcode.
BTW, this ensures we do not temporarily turn the socket into blocking
mode for the pfn_send call if the connection is in progress. It turned
out that doing so causes arbitrary GnuTLS handshake failures on
MS-Windows. (bug#22789)
---
src/w32.c | 34 ++++++++++++++++++++++++++--------
1 file changed, 26 insertions(+), 8 deletions(-)
diff --git a/src/w32.c b/src/w32.c
index ccf7cc3..c553152 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -8772,6 +8772,30 @@ sys_write (int fd, const void * buffer, unsigned int count)
unsigned long nblock = 0;
if (winsock_lib == NULL) emacs_abort ();
+ child_process *cp = fd_info[fd].cp;
+
+ /* If this is a non-blocking socket whose connection is in
+ progress or terminated with an error already, return the
+ proper error code to the caller. */
+ if (cp != NULL && (fd_info[fd].flags & FILE_CONNECT) != 0)
+ {
+ /* In case connection is in progress, ENOTCONN that would
+ result from calling pfn_send is not what callers expect. */
+ if (cp->status != STATUS_CONNECT_FAILED)
+ {
+ errno = EWOULDBLOCK;
+ return -1;
+ }
+ /* In case connection failed, use the actual error code
+ stashed by '_sys_wait_connect' in cp->errcode. */
+ else if (cp->errcode != 0)
+ {
+ pfn_WSASetLastError (cp->errcode);
+ set_errno ();
+ return -1;
+ }
+ }
+
/* TODO: implement select() properly so non-blocking I/O works. */
/* For now, make sure the write blocks. */
if (fd_info[fd].flags & FILE_NDELAY)
@@ -8782,14 +8806,8 @@ sys_write (int fd, const void * buffer, unsigned int count)
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)));
+ 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,
--
2.6.2.windows.1
next prev parent reply other threads:[~2016-03-07 22:21 UTC|newest]
Thread overview: 124+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-24 10:26 bug#22789: 25.1.50; In last master build https connections stop working José L. Doménech
2016-02-24 14:00 ` Lars Ingebrigtsen
2016-02-24 16:09 ` José L. Doménech
2016-02-24 18:06 ` Eli Zaretskii
2016-02-24 23:48 ` Lars Ingebrigtsen
2016-02-25 0:02 ` Lars Ingebrigtsen
2016-02-25 1:09 ` Lars Ingebrigtsen
2016-02-25 16:41 ` Eli Zaretskii
2016-02-26 2:29 ` Lars Ingebrigtsen
2016-02-26 9:36 ` Eli Zaretskii
2016-02-27 2:30 ` Lars Ingebrigtsen
2016-02-27 2:43 ` John Wiegley
2016-02-27 3:50 ` Lars Ingebrigtsen
2016-02-27 8:14 ` Eli Zaretskii
2016-02-27 3:49 ` Lars Ingebrigtsen
2016-02-27 8:10 ` Eli Zaretskii
2016-02-27 8:13 ` Eli Zaretskii
2016-02-27 18:05 ` Alain Schneble
2016-02-27 22:38 ` Lars Ingebrigtsen
2016-02-27 23:06 ` Alain Schneble
2016-02-27 23:49 ` Alain Schneble
2016-02-28 3:31 ` Lars Ingebrigtsen
2016-02-28 9:58 ` Alain Schneble
2016-02-28 16:53 ` Eli Zaretskii
2016-02-29 2:37 ` Lars Ingebrigtsen
2016-02-28 3:43 ` Eli Zaretskii
2016-02-28 9:48 ` Alain Schneble
2016-02-28 17:00 ` Eli Zaretskii
2016-02-29 2:49 ` Lars Ingebrigtsen
2016-02-29 3:43 ` Eli Zaretskii
2016-02-29 4:38 ` Lars Ingebrigtsen
2016-02-29 9:55 ` Alain Schneble
2016-02-29 10:03 ` Lars Ingebrigtsen
2016-02-29 17:57 ` Alain Schneble
2016-02-29 18:45 ` Eli Zaretskii
2016-02-29 21:22 ` Lars Ingebrigtsen
2016-03-01 3:35 ` Eli Zaretskii
2016-02-29 23:13 ` Alain Schneble
2016-03-01 0:41 ` Lars Ingebrigtsen
2016-03-01 3:41 ` Eli Zaretskii
2016-03-01 4:29 ` Lars Ingebrigtsen
2016-03-01 4:30 ` Lars Ingebrigtsen
2016-03-01 9:00 ` Andreas Schwab
2016-03-01 14:12 ` Lars Ingebrigtsen
2016-03-01 14:25 ` Alain Schneble
2016-03-01 14:43 ` Lars Ingebrigtsen
2016-03-01 15:59 ` Eli Zaretskii
2016-03-01 16:19 ` Alain Schneble
2016-03-01 17:00 ` Eli Zaretskii
2016-03-01 17:09 ` Alain Schneble
2016-03-01 17:22 ` Eli Zaretskii
2016-03-01 17:55 ` Alain Schneble
2016-03-01 18:13 ` Eli Zaretskii
2016-03-01 16:33 ` Andreas Schwab
2016-03-01 15:53 ` Eli Zaretskii
2016-03-01 15:36 ` Alain Schneble
2016-03-01 16:05 ` Eli Zaretskii
2016-03-01 16:25 ` Alain Schneble
2016-03-04 8:56 ` Eli Zaretskii
2016-03-04 16:55 ` Alain Schneble
2016-03-04 21:36 ` Alain Schneble
2016-03-04 22:33 ` Alain Schneble
2016-03-05 8:23 ` Eli Zaretskii
2016-03-05 18:27 ` Alain Schneble
2016-03-05 19:21 ` Eli Zaretskii
2016-03-06 22:45 ` Alain Schneble
2016-03-06 23:24 ` Alain Schneble
2016-03-07 8:49 ` Alain Schneble
2016-03-07 16:08 ` Eli Zaretskii
2016-03-07 17:20 ` Alain Schneble
2016-03-07 17:33 ` Eli Zaretskii
2016-03-07 18:03 ` Alain Schneble
2016-03-07 18:10 ` Eli Zaretskii
2016-03-07 18:26 ` Alain Schneble
2016-03-07 16:07 ` Eli Zaretskii
2016-03-07 16:47 ` Alain Schneble
2016-03-07 22:21 ` Alain Schneble [this message]
2016-03-08 16:40 ` Eli Zaretskii
2016-03-08 16:43 ` Alain Schneble
2016-03-10 14:45 ` Eli Zaretskii
2016-03-10 14:59 ` Alain Schneble
2016-03-06 9:31 ` Lars Magne Ingebrigtsen
2016-03-06 15:24 ` Eli Zaretskii
2016-03-05 8:46 ` Lars Magne Ingebrigtsen
2016-03-05 18:32 ` Alain Schneble
2016-02-29 21:18 ` Lars Ingebrigtsen
2016-02-29 23:20 ` Alain Schneble
2016-03-01 3:43 ` Eli Zaretskii
2016-03-01 5:17 ` Lars Ingebrigtsen
2016-03-01 15:46 ` Eli Zaretskii
2016-03-02 18:03 ` Lars Ingebrigtsen
2016-03-02 19:07 ` Alain Schneble
2016-03-02 19:15 ` Lars Ingebrigtsen
2016-03-02 19:38 ` Alain Schneble
2016-03-02 20:46 ` Alain Schneble
2016-03-02 22:02 ` Alain Schneble
2016-03-02 22:22 ` Lars Ingebrigtsen
2016-03-02 22:38 ` Alain Schneble
2016-03-03 0:07 ` Alain Schneble
2016-03-03 5:32 ` Lars Ingebrigtsen
2016-03-03 9:03 ` Alain Schneble
2016-03-02 19:43 ` Eli Zaretskii
2016-03-03 5:23 ` Lars Ingebrigtsen
2016-03-04 8:51 ` Eli Zaretskii
2016-03-04 11:33 ` Lars Ingebrigtsen
2016-03-04 14:48 ` Eli Zaretskii
2016-03-05 12:26 ` Lars Magne Ingebrigtsen
2016-03-05 13:24 ` Eli Zaretskii
2016-03-06 9:33 ` Lars Magne Ingebrigtsen
2016-03-06 15:26 ` Eli Zaretskii
2016-03-06 18:33 ` Lars Magne Ingebrigtsen
2016-03-06 18:41 ` Eli Zaretskii
2016-03-04 11:37 ` Lars Ingebrigtsen
2016-03-04 11:40 ` Lars Ingebrigtsen
2016-03-04 15:41 ` Eli Zaretskii
2016-03-04 15:43 ` Lars Ingebrigtsen
2016-03-04 16:12 ` Eli Zaretskii
2016-03-04 15:40 ` Eli Zaretskii
2016-03-01 15:43 ` Alain Schneble
2016-03-01 16:07 ` Eli Zaretskii
2016-03-01 16:26 ` Alain Schneble
2016-02-28 16:47 ` Eli Zaretskii
2016-02-25 3:46 ` Eli Zaretskii
2016-02-25 5:00 ` Lars Ingebrigtsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=86bn6qylmj.fsf@realize.ch \
--to=a.s@realize.ch \
--cc=22789@debbugs.gnu.org \
--cc=eliz@gnu.org \
--cc=j_l_domenech@yahoo.com \
--cc=larsi@gnus.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.