From eebcfa1ccd5ff02bc45b7945eade84ad22f39c95 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Sun, 26 May 2019 11:52:55 +0100 Subject: Debug: align tracing out for TFO connections with plain ones --- src/src/smtp_out.c | 2 +- src/src/transports/smtp.c | 27 +++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/src/smtp_out.c b/src/src/smtp_out.c index d8cb42e01..ea052b58a 100644 --- a/src/src/smtp_out.c +++ b/src/src/smtp_out.c @@ -641,7 +641,7 @@ for (;;) if((rc = ip_recv(cctx, inblock->buffer, inblock->buffersize, timeout)) <= 0) { - DEBUG(D_deliver|D_transport|D_acl) + DEBUG(D_deliver|D_transport|D_acl|D_v) debug_printf_indent(errno ? " SMTP(%s)<<\n" : " SMTP(closed)<<\n", strerror(errno)); break; diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c index 6ce4c9ded..94c1fe40c 100644 --- a/src/src/transports/smtp.c +++ b/src/src/transports/smtp.c @@ -590,10 +590,6 @@ switch(*errno_value) transport_count); return FALSE; - case ECONNREFUSED: /* First-read error on a TFO conn */ - if (verify_mode) *message = US strerror(*errno_value); - return FALSE; /* nonverify, do not set message */ - case ERRNO_SMTPFORMAT: /* Handle malformed SMTP response */ s = string_printing(buffer); while (isspace(*s)) s++; @@ -2844,6 +2840,29 @@ return OK; int code; RESPONSE_FAILED: + if (errno == ECONNREFUSED) /* first-read error on a TFO conn */ + { + /* There is a testing facility for simulating a connection timeout, as I + can't think of any other way of doing this. It converts a connection + refused into a timeout if the timeout is set to 999999. This is done for + a 3whs connection in ip_connect(), but a TFO connection does not error + there - instead it gets ECONNREFUSED on the first data read. Tracking + that a TFO really was done is too hard, or we would set a + sx->pending_conn_done bit and test that in smtp_reap_banner() and + smtp_reap_ehlo(). That would let us also add the conn-timeout to the + cmd-timeout. */ + + if (f.running_in_test_harness && ob->connect_timeout == 999999) + errno = ETIMEDOUT; + set_errno_nohost(sx->addrlist, + errno == ETIMEDOUT ? ERRNO_CONNECTTIMEOUT : errno, + sx->verify ? US strerror(errno) : NULL, + DEFER, FALSE); + sx->send_quit = FALSE; + return DEFER; + } + + /* really an error on an SMTP read */ message = NULL; sx->send_quit = check_response(sx->conn_args.host, &errno, sx->addrlist->more_errno, sx->buffer, &code, &message, &pass_message); -- cgit v1.2.3