From 53c7b3a70978c2748f46d1d99211530750b1de22 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Sun, 8 Dec 2019 19:26:15 +0000 Subject: [PATCH] Fix macOS build --- src/src/smtp_in.c | 38 +++++++++++++++++++++++--------------- src/src/smtp_out.c | 4 +++- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/src/smtp_in.c b/src/src/smtp_in.c index 9a31247be..580fe9f91 100644 --- a/src/src/smtp_in.c +++ b/src/src/smtp_in.c @@ -2400,7 +2400,26 @@ return FALSE; static void tfo_in_check(void) { -# ifdef TCP_INFO +# ifdef __FreeBSD__ +int is_fastopen; +socklen_t len = sizeof(is_fastopen); + +/* The tinfo TCPOPT_FAST_OPEN bit seems unreliable, and we don't see state +TCP_SYN_RCV (as of 12.1) so no idea about data-use. */ + +if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_FASTOPEN, &is_fastopen, &len) == 0) + { + if (is_fastopen) + { + DEBUG(D_receive) + debug_printf("TFO mode connection (TCP_FASTOPEN getsockopt)\n"); + f.tcp_in_fastopen = TRUE; + } + } +else DEBUG(D_receive) + debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno)); + +# elif defined(TCP_INFO) struct tcp_info tinfo; socklen_t len = sizeof(tinfo); @@ -2409,7 +2428,7 @@ if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_INFO, &tinfo, &len) == 0) if (tinfo.tcpi_options & TCPI_OPT_SYN_DATA) { DEBUG(D_receive) - debug_printf("TCP_FASTOPEN mode connection (ACKd data-on-SYN)\n"); + debug_printf("TFO mode connection (ACKd data-on-SYN)\n"); f.tcp_in_fastopen_data = f.tcp_in_fastopen = TRUE; } else @@ -2417,20 +2436,9 @@ if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_INFO, &tinfo, &len) == 0) if (tinfo.tcpi_state == TCP_SYN_RECV) /* Not seen on FreeBSD 12.1 */ { DEBUG(D_receive) - debug_printf("TCP_FASTOPEN mode connection (state TCP_SYN_RECV)\n"); + debug_printf("TFO mode connection (state TCP_SYN_RECV)\n"); f.tcp_in_fastopen = TRUE; } -# ifdef __FreeBSD__ - else if (tinfo.tcpi_options & TCPOPT_FAST_OPEN) - { - /* This only tells us that some combination of the TCP options was used. It - can be a TFO-R received (as of 12.1). However, pretend it shows real usage - (that an acceptable TFO-C was received and acted on). Ignore the possibility - of data-on-SYN for now. */ - DEBUG(D_receive) debug_printf("TCP_FASTOPEN mode connection (TFO option used)\n"); - f.tcp_in_fastopen = TRUE; - } -# endif else DEBUG(D_receive) debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno)); # endif @@ -3050,7 +3058,7 @@ smtp_printf("%s", handshake arrived. If so we must have managed a TFO. */ #ifdef TCP_FASTOPEN -tfo_in_check(); +if (sender_host_address && !f.sender_host_notsocket) tfo_in_check(); #endif return TRUE; diff --git a/src/src/smtp_out.c b/src/src/smtp_out.c index 3dc3a13fb..96ee15282 100644 --- a/src/src/smtp_out.c +++ b/src/src/smtp_out.c @@ -155,11 +155,11 @@ return TRUE; static void tfo_out_check(int sock) { +# ifdef __FreeBSD__ struct tcp_info tinfo; int val; socklen_t len = sizeof(val); -# ifdef __FreeBSD__ /* The observability as of 12.1 is not useful as a client, only telling us that a TFO option was used on SYN. It could have been a TFO-R, or ignored by the server. */ @@ -177,6 +177,8 @@ switch (tcp_out_fastopen) # else /* Linux & Apple */ # if defined(TCP_INFO) && defined(EXIM_HAVE_TCPI_UNACKED) +struct tcp_info tinfo; +socklen_t len = sizeof(tinfo); switch (tcp_out_fastopen) { -- 2.25.1