X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/96eb7d2a5b86afec3b66a61a1ba8af82ab0c6d41..4e48d56c083d2f763a5978e1dbf515b12dc12f96:/src/src/transports/smtp.c diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c index 041ed9393..baf304405 100644 --- a/src/src/transports/smtp.c +++ b/src/src/transports/smtp.c @@ -90,7 +90,7 @@ optionlist smtp_transport_options[] = { (void *)offsetof(smtp_transport_options_block, hosts_avoid_esmtp) }, { "hosts_avoid_pipelining", opt_stringptr, (void *)offsetof(smtp_transport_options_block, hosts_avoid_pipelining) }, -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS { "hosts_avoid_tls", opt_stringptr, (void *)offsetof(smtp_transport_options_block, hosts_avoid_tls) }, #endif @@ -98,7 +98,7 @@ optionlist smtp_transport_options[] = { (void *)offsetof(smtp_transport_options_block, hosts_max_try) }, { "hosts_max_try_hardlimit", opt_int, (void *)offsetof(smtp_transport_options_block, hosts_max_try_hardlimit) }, -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS { "hosts_nopass_tls", opt_stringptr, (void *)offsetof(smtp_transport_options_block, hosts_nopass_tls) }, { "hosts_noproxy_tls", opt_stringptr, @@ -106,19 +106,19 @@ optionlist smtp_transport_options[] = { #endif { "hosts_override", opt_bool, (void *)offsetof(smtp_transport_options_block, hosts_override) }, -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT { "hosts_pipe_connect", opt_stringptr, (void *)offsetof(smtp_transport_options_block, hosts_pipe_connect) }, #endif { "hosts_randomize", opt_bool, (void *)offsetof(smtp_transport_options_block, hosts_randomize) }, -#if defined(SUPPORT_TLS) && !defined(DISABLE_OCSP) +#if !defined(DISABLE_TLS) && !defined(DISABLE_OCSP) { "hosts_request_ocsp", opt_stringptr, (void *)offsetof(smtp_transport_options_block, hosts_request_ocsp) }, #endif { "hosts_require_auth", opt_stringptr, (void *)offsetof(smtp_transport_options_block, hosts_require_auth) }, -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS # ifdef SUPPORT_DANE { "hosts_require_dane", opt_stringptr, (void *)offsetof(smtp_transport_options_block, hosts_require_dane) }, @@ -134,7 +134,7 @@ optionlist smtp_transport_options[] = { (void *)offsetof(smtp_transport_options_block, hosts_try_auth) }, { "hosts_try_chunking", opt_stringptr, (void *)offsetof(smtp_transport_options_block, hosts_try_chunking) }, -#if defined(SUPPORT_TLS) && defined(SUPPORT_DANE) +#ifdef SUPPORT_DANE { "hosts_try_dane", opt_stringptr, (void *)offsetof(smtp_transport_options_block, hosts_try_dane) }, #endif @@ -144,7 +144,7 @@ optionlist smtp_transport_options[] = { { "hosts_try_prdr", opt_stringptr, (void *)offsetof(smtp_transport_options_block, hosts_try_prdr) }, #endif -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS { "hosts_verify_avoid_tls", opt_stringptr, (void *)offsetof(smtp_transport_options_block, hosts_verify_avoid_tls) }, #endif @@ -172,7 +172,7 @@ optionlist smtp_transport_options[] = { { "socks_proxy", opt_stringptr, (void *)offsetof(smtp_transport_options_block, socks_proxy) }, #endif -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS { "tls_certificate", opt_stringptr, (void *)offsetof(smtp_transport_options_block, tls_certificate) }, { "tls_crl", opt_stringptr, @@ -240,11 +240,11 @@ smtp_transport_options_block smtp_transport_option_defaults = { .hosts_require_auth = NULL, .hosts_try_chunking = US"*", #ifdef SUPPORT_DANE - .hosts_try_dane = NULL, + .hosts_try_dane = US"*", .hosts_require_dane = NULL, .dane_require_tls_ciphers = NULL, #endif - .hosts_try_fastopen = NULL, + .hosts_try_fastopen = US"*", #ifndef DISABLE_PRDR .hosts_try_prdr = US"*", #endif @@ -256,11 +256,11 @@ smtp_transport_options_block smtp_transport_option_defaults = { .hosts_avoid_tls = NULL, .hosts_verify_avoid_tls = NULL, .hosts_avoid_pipelining = NULL, -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT .hosts_pipe_connect = NULL, #endif .hosts_avoid_esmtp = NULL, -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS .hosts_nopass_tls = NULL, .hosts_noproxy_tls = NULL, #endif @@ -288,7 +288,7 @@ smtp_transport_options_block smtp_transport_option_defaults = { #ifdef SUPPORT_SOCKS .socks_proxy = NULL, #endif -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS .tls_certificate = NULL, .tls_crl = NULL, .tls_privatekey = NULL, @@ -815,7 +815,7 @@ return TRUE; -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT static uschar * ehlo_cache_key(const smtp_context * sx) { @@ -1081,7 +1081,7 @@ address_item * addr = sx->sync_addr; smtp_transport_options_block * ob = sx->conn_args.ob; int yield = 0; -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT int rc; if ((rc = smtp_reap_early_pipe(sx, &count)) != OK) return rc == FAIL ? -4 : -5; @@ -1397,7 +1397,7 @@ smtp_auth(smtp_context * sx) host_item * host = sx->conn_args.host; /* host to deliver to */ smtp_transport_options_block * ob = sx->conn_args.ob; /* transport options */ int require_auth = verify_check_given_host(CUSS &ob->hosts_require_auth, host); -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT unsigned short authbits = tls_out.active.sock >= 0 ? sx->ehlo_resp.crypted_auths : sx->ehlo_resp.cleartext_auths; #endif @@ -1413,7 +1413,7 @@ if (!regex_AUTH) if ( sx->esmtp && -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT sx->early_pipe_active ? authbits : #endif @@ -1423,7 +1423,7 @@ if ( sx->esmtp uschar * names = NULL; expand_nmax = -1; /* reset */ -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (!sx->early_pipe_active) #endif names = string_copyn(expand_nstring[1], expand_nlength[1]); @@ -1437,7 +1437,7 @@ if ( sx->esmtp DEBUG(D_transport) debug_printf("scanning authentication mechanisms\n"); fail_reason = US"no common mechanisms were found"; -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (sx->early_pipe_active) { /* Scan our authenticators (which support use by a client and were offered @@ -1687,7 +1687,7 @@ smtp_local_identity(uschar * sender, struct transport_instance * tblock) address_item * addr1; uschar * if1 = US""; uschar * helo1 = US""; -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS uschar * tlsc1 = US""; #endif uschar * save_sender_address = sender_address; @@ -1705,7 +1705,7 @@ if (ob->interface) if (ob->helo_data) helo1 = expand_string(ob->helo_data); -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS if (ob->tls_certificate) tlsc1 = expand_string(ob->tls_certificate); local_identity = string_sprintf ("%s^%s^%s", if1, helo1, tlsc1); @@ -1754,7 +1754,7 @@ size_t bsize = Ustrlen(buf); /* debug_printf("%s: check for 0x%04x\n", __FUNCTION__, checks); */ -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS if ( checks & OPTION_TLS && pcre_exec(regex_STARTTLS, NULL, CS buf, bsize, 0, PCRE_EOPT, NULL, 0) < 0) #endif @@ -1794,7 +1794,7 @@ if ( checks & OPTION_SIZE && pcre_exec(regex_SIZE, NULL, CS buf, bsize, 0, PCRE_EOPT, NULL, 0) < 0) checks &= ~OPTION_SIZE; -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if ( checks & OPTION_EARLY_PIPE && pcre_exec(regex_EARLY_PIPE, NULL, CS buf, bsize, 0, PCRE_EOPT, NULL, 0) < 0) @@ -1841,7 +1841,7 @@ there may be more writes (like, the chunk data) done soon. */ if (chunk_size > 0) { -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT BOOL new_conn = !!(sx->outblock.conn_args); #endif if((cmd_count = smtp_write_command(sx, @@ -1850,7 +1850,7 @@ if (chunk_size > 0) ) < 0) return ERROR; if (flags & tc_chunk_last) data_command = string_copy(big_buffer); /* Save for later error message */ -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT /* That command write could have been the one that made the connection. Copy the fd from the client conn ctx (smtp transport specific) to the generic transport ctx. */ @@ -1883,7 +1883,7 @@ if (flags & tc_reap_prev && prev_cmd_count > 0) case -5: errno = ERRNO_TLSFAILURE; return DEFER; -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT case -4: /* non-2xx for pipelined banner or EHLO */ #endif case -1: /* Timeout on RCPT */ @@ -1954,7 +1954,7 @@ BOOL pass_message = FALSE; uschar * message = NULL; int yield = OK; int rc; -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS uschar * tls_errstr; #endif @@ -1972,12 +1972,12 @@ sx->esmtp_sent = FALSE; sx->utf8_needed = FALSE; #endif sx->dsn_all_lasthop = TRUE; -#if defined(SUPPORT_TLS) && defined(SUPPORT_DANE) +#ifdef SUPPORT_DANE sx->conn_args.dane = FALSE; sx->dane_required = verify_check_given_host(CUSS &ob->hosts_require_dane, sx->conn_args.host) == OK; #endif -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT sx->early_pipe_active = sx->early_pipe_ok = FALSE; sx->ehlo_resp.cleartext_features = sx->ehlo_resp.crypted_features = 0; sx->pending_BANNER = sx->pending_EHLO = FALSE; @@ -2019,7 +2019,7 @@ tls_out.cipher = NULL; /* the one we may use for this transport */ tls_out.ourcert = NULL; tls_out.peercert = NULL; tls_out.peerdn = NULL; -#if defined(SUPPORT_TLS) && !defined(USE_GNUTLS) +#ifdef USE_OPENSSL tls_out.sni = NULL; #endif tls_out.ocsp = OCSP_NOT_REQ; @@ -2034,7 +2034,7 @@ For verify, unflipped once the callout is dealt with */ tls_modify_variables(&tls_out); -#ifndef SUPPORT_TLS +#ifdef DISABLE_TLS if (sx->smtps) { set_errno_nohost(sx->addrlist, ERRNO_TLSFAILURE, US"TLS support not available", @@ -2056,7 +2056,7 @@ if (!continue_hostname) smtp_port_for_connect(sx->conn_args.host, sx->port); -#if defined(SUPPORT_TLS) && defined(SUPPORT_DANE) +#ifdef SUPPORT_DANE /* Do TLSA lookup for DANE */ { tls_out.dane_verified = FALSE; @@ -2105,18 +2105,30 @@ if (!continue_hostname) sx->inblock.cctx = sx->outblock.cctx = &sx->cctx; sx->avoid_option = sx->peer_offered = smtp_peer_options = 0; -#ifdef EXPERIMENTAL_PIPE_CONNECT - if (verify_check_given_host(CUSS &ob->hosts_pipe_connect, sx->conn_args.host) == OK) - { - sx->early_pipe_ok = TRUE; - if ( read_ehlo_cache_entry(sx) - && sx->ehlo_resp.cleartext_features & OPTION_EARLY_PIPE) +#ifdef SUPPORT_PIPE_CONNECT + if ( verify_check_given_host(CUSS &ob->hosts_pipe_connect, + sx->conn_args.host) == OK) + + /* We don't find out the local ip address until the connect, so if + the helo string might use it avoid doing early-pipelining. */ + + if ( !sx->helo_data + || !Ustrstr(sx->helo_data, "$sending_ip_address") + || Ustrstr(sx->helo_data, "def:sending_ip_address") + ) { - DEBUG(D_transport) debug_printf("Using cached cleartext PIPE_CONNECT\n"); - sx->early_pipe_active = TRUE; - sx->peer_offered = sx->ehlo_resp.cleartext_features; + sx->early_pipe_ok = TRUE; + if ( read_ehlo_cache_entry(sx) + && sx->ehlo_resp.cleartext_features & OPTION_EARLY_PIPE) + { + DEBUG(D_transport) + debug_printf("Using cached cleartext PIPE_CONNECT\n"); + sx->early_pipe_active = TRUE; + sx->peer_offered = sx->ehlo_resp.cleartext_features; + } } - } + else DEBUG(D_transport) + debug_printf("helo needs $sending_ip_address\n"); if (sx->early_pipe_active) sx->outblock.conn_args = &sx->conn_args; @@ -2125,16 +2137,9 @@ if (!continue_hostname) { if ((sx->cctx.sock = smtp_connect(&sx->conn_args, NULL)) < 0) { - uschar * msg = NULL; - if (sx->verify) - { - msg = US strerror(errno); - HDEBUG(D_verify) debug_printf("connect: %s\n", msg); - } set_errno_nohost(sx->addrlist, errno == ETIMEDOUT ? ERRNO_CONNECTTIMEOUT : errno, - sx->verify ? string_sprintf("could not connect: %s", msg) - : NULL, + sx->verify ? US strerror(errno) : NULL, DEFER, FALSE); sx->send_quit = FALSE; return DEFER; @@ -2175,7 +2180,7 @@ will be? Somehow I doubt it. */ if (!sx->smtps) { -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (sx->early_pipe_active) { sx->pending_BANNER = TRUE; /* sync_responses() must eventually handle */ @@ -2262,7 +2267,7 @@ goto SEND_QUIT; /* Alas; be careful, since this goto is not an error-out, so conceivably we might set data between here and the target which we assume to exist and be usable. I can see this coming back to bite us. */ -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS if (sx->smtps) { smtp_peer_options |= OPTION_TLS; @@ -2276,7 +2281,7 @@ goto SEND_QUIT; if (sx->esmtp) { if (smtp_write_command(sx, -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT sx->early_pipe_active ? SCMD_BUFFER : #endif SCMD_FLUSH, @@ -2284,7 +2289,7 @@ goto SEND_QUIT; goto SEND_FAILED; sx->esmtp_sent = TRUE; -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (sx->early_pipe_active) { sx->pending_EHLO = TRUE; @@ -2317,7 +2322,7 @@ goto SEND_QUIT; DEBUG(D_transport) debug_printf("not sending EHLO (host matches hosts_avoid_esmtp)\n"); -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (!sx->early_pipe_active) #endif if (!sx->esmtp) @@ -2352,13 +2357,13 @@ goto SEND_QUIT; if (sx->esmtp || sx->lmtp) { -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (!sx->early_pipe_active) #endif { sx->peer_offered = ehlo_response(sx->buffer, OPTION_TLS /* others checked later */ -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT | (sx->early_pipe_ok ? OPTION_IGNQ | OPTION_CHUNKING | OPTION_PRDR | OPTION_DSN | OPTION_PIPE | OPTION_SIZE @@ -2370,7 +2375,7 @@ goto SEND_QUIT; ) #endif ); -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (sx->early_pipe_ok) { sx->ehlo_resp.cleartext_features = sx->peer_offered; @@ -2388,7 +2393,7 @@ goto SEND_QUIT; /* Set tls_offered if the response to EHLO specifies support for STARTTLS. */ -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS smtp_peer_options |= sx->peer_offered & OPTION_TLS; #endif } @@ -2450,7 +2455,7 @@ negative, the original EHLO data is available for subsequent analysis, should the client not be required to use TLS. If the response is bad, copy the buffer for error analysis. */ -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS if ( smtp_peer_options & OPTION_TLS && !suppress_tls && verify_check_given_host(CUSS &ob->hosts_avoid_tls, sx->conn_args.host) != OK @@ -2463,7 +2468,7 @@ if ( smtp_peer_options & OPTION_TLS if (smtp_write_command(sx, SCMD_FLUSH, "STARTTLS\r\n") < 0) goto SEND_FAILED; -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT /* If doing early-pipelining reap the banner and EHLO-response but leave the response for the STARTTLS we just sent alone. */ @@ -2567,7 +2572,7 @@ if (tls_out.active.sock >= 0) goto SEND_QUIT; } -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT /* For SMTPS there is no cleartext early-pipe; use the crypted permission bit. We're unlikely to get the group sent and delivered before the server sends its banner, but it's still worth sending as a group. @@ -2585,7 +2590,7 @@ if (tls_out.active.sock >= 0) /* For SMTPS we need to wait for the initial OK response. */ if (sx->smtps) -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (sx->early_pipe_active) { sx->pending_BANNER = TRUE; @@ -2608,14 +2613,14 @@ if (tls_out.active.sock >= 0) } if (smtp_write_command(sx, -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT sx->early_pipe_active ? SCMD_BUFFER : #endif SCMD_FLUSH, "%s %s\r\n", greeting_cmd, sx->helo_data) < 0) goto SEND_FAILED; -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (sx->early_pipe_active) sx->pending_EHLO = TRUE; else @@ -2665,7 +2670,7 @@ else if ( sx->smtps # endif goto TLS_FAILED; } -#endif /*SUPPORT_TLS*/ +#endif /*DISABLE_TLS*/ /* If TLS is active, we have just started it up and re-done the EHLO command, so its response needs to be analyzed. If TLS is not active and this is a @@ -2673,20 +2678,20 @@ continued session down a previously-used socket, we haven't just done EHLO, so we skip this. */ if (continue_hostname == NULL -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS || tls_out.active.sock >= 0 #endif ) { if (sx->esmtp || sx->lmtp) { -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (!sx->early_pipe_active) #endif { sx->peer_offered = ehlo_response(sx->buffer, 0 /* no TLS */ -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT | (sx->lmtp && ob->lmtp_ignore_quota ? OPTION_IGNQ : 0) | OPTION_DSN | OPTION_PIPE | OPTION_SIZE | OPTION_CHUNKING | OPTION_PRDR | OPTION_UTF8 @@ -2707,7 +2712,7 @@ if (continue_hostname == NULL | (ob->size_addition >= 0 ? OPTION_SIZE : 0) #endif ); -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (tls_out.active.sock >= 0) sx->ehlo_resp.crypted_features = sx->peer_offered; #endif @@ -2755,7 +2760,7 @@ if (continue_hostname == NULL DEBUG(D_transport) debug_printf("%susing DSN\n", sx->peer_offered & OPTION_DSN ? "" : "not "); -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if ( sx->early_pipe_ok && !sx->early_pipe_active && tls_out.active.sock >= 0 @@ -2847,6 +2852,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); @@ -2874,7 +2902,7 @@ return OK; in message and errno, and setting_up will always be true. Treat as a temporary error. */ -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS TLS_FAILED: code = '4', yield = DEFER; goto FAILED; @@ -2904,7 +2932,8 @@ FAILED: || errno == ERRNO_UTF8_FWD #endif ? FAIL : DEFER, - pass_message, sx->conn_args.host + pass_message, + errno == ECONNREFUSED ? NULL : sx->conn_args.host #ifdef EXPERIMENTAL_DSN_INFO , sx->smtp_greeting, sx->helo_response #endif @@ -2917,7 +2946,7 @@ SEND_QUIT: if (sx->send_quit) (void)smtp_write_command(sx, SCMD_FLUSH, "QUIT\r\n"); -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS if (sx->cctx.tls_ctx) { tls_close(sx->cctx.tls_ctx, TLS_SHUTDOWN_NOWAIT); @@ -3247,7 +3276,7 @@ for (addr = sx->first_addr, address_count = 0; case -2: return -2; /* non-MAIL read i/o error */ default: return -1; /* any MAIL error */ -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT case -4: return -1; /* non-2xx for pipelined banner or EHLO */ case -5: return -1; /* TLS first-read error */ #endif @@ -3261,7 +3290,7 @@ return 0; } -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS /***************************************************** * Proxy TLS connection for another transport process * ******************************************************/ @@ -3579,7 +3608,7 @@ if ( !(sx.peer_offered & OPTION_CHUNKING) case -1: goto END_OFF; /* Timeout on RCPT */ -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT case -5: /* TLS first-read error */ case -4: HDEBUG(D_transport) debug_printf("failed reaping pipelined cmd responses\n"); @@ -3725,7 +3754,7 @@ else case -1: goto END_OFF; /* Timeout on RCPT */ -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT case -5: /* TLS first-read error */ case -4: HDEBUG(D_transport) debug_printf("failed reaping pipelined cmd responses\n"); @@ -3877,7 +3906,7 @@ else if (tcp_out_fastopen >= TFO_USED_DATA) setflag(addr, af_tcp_fastopen_data); } if (sx.pipelining_used) setflag(addr, af_pipelining); -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT if (sx.early_pipe_active) setflag(addr, af_early_pipe); #endif #ifndef DISABLE_PRDR @@ -4079,7 +4108,7 @@ if (!sx.ok) else { -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifdef SUPPORT_PIPE_CONNECT /* If we were early-pipelinng and the actual EHLO response did not match the cached value we assumed, we could have detected it and passed a custom errno through to here. It would be nice to RSET and retry right @@ -4148,7 +4177,7 @@ if (sx.completed_addr && sx.ok && sx.send_quit) if ( sx.first_addr != NULL || f.continue_more || ( -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS ( tls_out.active.sock < 0 && !continue_proxy_cipher || verify_check_given_host(CUSS &ob->hosts_nopass_tls, host) != OK ) @@ -4186,7 +4215,7 @@ if (sx.completed_addr && sx.ok && sx.send_quit) if (sx.ok) { -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS int pfd[2]; #endif int socket_fd = sx.cctx.sock; @@ -4203,7 +4232,7 @@ if (sx.completed_addr && sx.ok && sx.send_quit) transport_pass_socket). If the caller has more ready, just return with the connection still open. */ -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS if (tls_out.active.sock >= 0) if ( f.continue_more || verify_check_given_host(CUSS &ob->hosts_noproxy_tls, host) == OK) @@ -4262,7 +4291,7 @@ propagate it from the initial just passed the baton to. Fork a child to to do it, and return to get logging done asap. Which way to place the work makes assumptions about post-fork prioritisation which may not hold on all platforms. */ -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS if (tls_out.active.sock >= 0) { int pid = fork(); @@ -4330,7 +4359,7 @@ if (sx.send_quit) (void)smtp_write_command(&sx, SCMD_FLUSH, "QUIT\r\n"); END_OFF: -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS tls_close(sx.cctx.tls_ctx, TLS_SHUTDOWN_NOWAIT); sx.cctx.tls_ctx = NULL; #endif @@ -4449,7 +4478,7 @@ for (address_item * addr = addrlist; addr; addr = addr->next) addr->basic_errno = 0; addr->more_errno = (host->mx >= 0)? 'M' : 'A'; addr->message = NULL; -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS addr->cipher = NULL; addr->ourcert = NULL; addr->peercert = NULL; @@ -5112,7 +5141,7 @@ retry_non_continued: session, so the in-clear transmission after those errors, if permitted, happens inside smtp_deliver().] */ -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS if ( rc == DEFER && first_addr->basic_errno == ERRNO_TLSFAILURE && ob->tls_tempfail_tryclear @@ -5132,7 +5161,7 @@ retry_non_continued: deferred_event_raise(first_addr, host); # endif } -#endif /*SUPPORT_TLS*/ +#endif /*DISABLE_TLS*/ } /* Delivery attempt finished */ @@ -5305,7 +5334,7 @@ retry_non_continued: int fd = cutthrough.cctx.sock >= 0 ? cutthrough.cctx.sock : 0; DEBUG(D_transport) debug_printf("no hosts match already-open connection\n"); -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS /* A TLS conn could be open for a cutthrough, but not for a plain continued- transport */ /*XXX doublecheck that! */