]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Avoid logging pre-verstring EPIPE from sharing downstreams.
authorSimon Tatham <anakin@pobox.com>
Fri, 25 Sep 2015 11:05:55 +0000 (12:05 +0100)
committerSimon Tatham <anakin@pobox.com>
Fri, 25 Sep 2015 11:17:35 +0000 (12:17 +0100)
If you use the new 'plink -shareexists' feature, then on Unix at least
it's possible for the upstream to receive EPIPE, because the
downstream makes a test connection and immediately closes it, so that
upstream fails to write its version string.

This looks a bit ugly in the upstream's Event Log, so I'm making a
special case: an error of 'broken pipe' type, which occurs on a socket
from a connection sharing downstream, before we've received a version
string from that downstream, is treated as an unusual kind of normal
connection termination and not logged as an error.

sshshare.c
unix/unix.h
windows/winstuff.h

index 6222003969fc6529ba04f283ff9a310e45c31ca5..c9124cfbe05bda9ce89144514bf7c02594596b5f 100644 (file)
 #include <stdlib.h>
 #include <assert.h>
 #include <limits.h>
+#include <errno.h>
 
 #include "putty.h"
 #include "tree234.h"
@@ -914,8 +915,26 @@ static int share_closing(Plug plug, const char *error_msg, int error_code,
                          int calling_back)
 {
     struct ssh_sharing_connstate *cs = (struct ssh_sharing_connstate *)plug;
-    if (error_msg)
-        ssh_sharing_logf(cs->parent->ssh, cs->id, "%s", error_msg);
+
+    if (error_msg) {
+#ifdef BROKEN_PIPE_ERROR_CODE
+        /*
+         * Most of the time, we log what went wrong when a downstream
+         * disappears with a socket error. One exception, though, is
+         * receiving EPIPE when we haven't received a protocol version
+         * string from the downstream, because that can happen as a result
+         * of plink -shareexists (opening the connection and instantly
+         * closing it again without bothering to read our version string).
+         * So that one case is not treated as a log-worthy error.
+         */
+        printf("%d %d\n", error_code, cs->got_verstring);
+        if (error_code == BROKEN_PIPE_ERROR_CODE && !cs->got_verstring)
+            /* do nothing */;
+        else
+#endif
+            ssh_sharing_logf(cs->parent->ssh, cs->id,
+                             "Socket error: %s", error_msg);
+    }
     share_begin_cleanup(cs);
     return 1;
 }
index b71d9210a9b39159efa72ba8fa27c39b66c845b8..f603eb51803437cdec830bd50e1630eb3f5d0bf3 100644 (file)
@@ -45,6 +45,8 @@ typedef void *Context;                 /* FIXME: probably needs changing */
 
 extern Backend pty_backend;
 
+#define BROKEN_PIPE_ERROR_CODE EPIPE   /* used in sshshare.c */
+
 typedef uint32_t uint32; /* C99: uint32_t defined in stdint.h */
 #define PUTTY_UINT32_DEFINED
 
index 8f5e0dff0625cb485088c13fd65060e381e57652..5147c08f37941717969934c99512f101e24ac361 100644 (file)
@@ -79,6 +79,8 @@ struct FontSpec *fontspec_new(const char *name,
 #define PLATFORM_HAS_SMEMCLR /* inhibit cross-platform one in misc.c */
 #endif
 
+#define BROKEN_PIPE_ERROR_CODE ERROR_BROKEN_PIPE   /* used in sshshare.c */
+
 /*
  * Dynamically linked functions. These come in two flavours:
  *