From a073bee10b5d35dae36c8417c705222b990807ec Mon Sep 17 00:00:00 2001 From: simon Date: Sun, 9 Sep 2001 15:41:58 +0000 Subject: [PATCH] Modify the FIXME into a calculated risk. I don't like this, but I don't like the thought of having to try to fix it either, particularly when I can't tell whether it'll work or not without reproducing the (probably phantom) problem. Gah. I wish WinSock would give better documentation of possible error returns. git-svn-id: svn://svn.tartarus.org/sgt/putty@1260 cda61777-01e9-0310-a592-d414129be87e --- winnet.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/winnet.c b/winnet.c index c5e9eb7a..b6710472 100644 --- a/winnet.c +++ b/winnet.c @@ -745,7 +745,6 @@ void try_send(Actual_Socket s) urgentflag = 0; bufchain_prefix(&s->output_data, &data, &len); } - nsent = send(s->s, data, len, urgentflag); noise_ultralight(nsent); if (nsent <= 0) { @@ -765,17 +764,30 @@ void try_send(Actual_Socket s) } else if (nsent == 0 || err == WSAECONNABORTED || err == WSAECONNRESET) { /* - * FIXME. This will have to be done better when we - * start managing multiple sockets (e.g. SSH port - * forwarding), because if we get CONNRESET while - * trying to write a particular forwarded socket - * then it isn't necessarily the end of the world. - * Ideally I'd like to pass the error code back to - * somewhere the next select_result() will see it, - * but that might be hard. Perhaps I should pass it - * back to be queued in the Windows front end bit. + * ASSUMPTION: + * + * I'm assuming here that if a TCP connection is + * reset or aborted once established, we will be + * notified by a select event rather than a + * CONNABORTED or CONNRESET from send(). In other + * words, I'm assuming CONNABORTED and CONNRESET + * don't come back from a _nonblocking_ send(), + * because the local side doesn't know they've + * happened until it waits for a response to its + * TCP segment - so the error will arrive + * asynchronously. + * + * If I'm wrong, this will be a really nasty case, + * because we can't necessarily call plug_closing() + * without having to make half the SSH code + * reentrant; so instead we'll have to schedule a + * call to plug_closing() for some suitable future + * time. */ - fatalbox(winsock_error_string(err)); + fatalbox("SERIOUS NETWORK INTERNAL ERROR: %s\n" + "Please report this immediately to " + ".", + winsock_error_string(err)); } else { fatalbox(winsock_error_string(err)); } -- 2.11.0