From 5133d2a133671a9236afc710cfe3da80e4c39363 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Fri, 25 Sep 2015 12:05:55 +0100 Subject: [PATCH] Avoid logging pre-verstring EPIPE from sharing downstreams. 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 | 23 +++++++++++++++++++++-- unix/unix.h | 2 ++ windows/winstuff.h | 2 ++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/sshshare.c b/sshshare.c index 62220039..c9124cfb 100644 --- a/sshshare.c +++ b/sshshare.c @@ -133,6 +133,7 @@ #include #include #include +#include #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; } diff --git a/unix/unix.h b/unix/unix.h index b71d9210..f603eb51 100644 --- a/unix/unix.h +++ b/unix/unix.h @@ -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 diff --git a/windows/winstuff.h b/windows/winstuff.h index 8f5e0dff..5147c08f 100644 --- a/windows/winstuff.h +++ b/windows/winstuff.h @@ -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: * -- 2.45.1