Modify the FIXME into a calculated risk. I don't like this, but I
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 9 Sep 2001 15:41:58 +0000 (15:41 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 9 Sep 2001 15:41:58 +0000 (15:41 +0000)
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

index c5e9eb7..b671047 100644 (file)
--- 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 "
+                        "<putty@projects.tartarus.org>.",
+                        winsock_error_string(err));
            } else {
                fatalbox(winsock_error_string(err));
            }