diff options
author | Brian Foley <bpfoley@google.com> | 2020-01-25 15:27:49 +0000 |
---|---|---|
committer | Jeremy Harris <jgh146exb@wizmail.org> | 2020-01-25 15:27:49 +0000 |
commit | c3da38a12a2372a7f6a48be97ebfd80aeceda828 (patch) | |
tree | 36f6d0bdbce92241847fc4d21163871cd446ae3d /src | |
parent | 3af060926c5d1c0786a446762c333c91f0665187 (diff) |
TFO: even in binary built for modern Linux, handle error returned by old Linux kernel. Bug 2518
Diffstat (limited to 'src')
-rw-r--r-- | src/src/ip.c | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/src/src/ip.c b/src/src/ip.c index a6b7de389..4c543566d 100644 --- a/src/src/ip.c +++ b/src/src/ip.c @@ -254,28 +254,34 @@ if (fastopen_blob && f.tcp_fastopen_ok) /*XXX also seen on successful TFO, sigh */ tcp_out_fastopen = fastopen_blob->len > 0 ? TFO_ATTEMPTED_DATA : TFO_ATTEMPTED_NODATA; } - else if (errno == EINPROGRESS) /* expected if we had no cookie for peer */ + else switch (errno) + { + case EINPROGRESS: /* expected if we had no cookie for peer */ /* seen for no-data, proper TFO option, both cookie-request and with-cookie cases */ /* apparently no visibility of the diffference at this point */ /* seen for with-data, proper TFO opt, cookie-req */ /* with netwk delay, post-conn tcp_info sees unacked 1 for R, 2 for C; code in smtp_out.c */ /* ? older Experimental TFO option behaviour ? */ - { /* queue unsent data */ - DEBUG(D_transport|D_v) debug_printf(" TFO mode sendto, %s data: EINPROGRESS\n", - fastopen_blob->len > 0 ? "with" : "no"); - if (!fastopen_blob->data) - { - tcp_out_fastopen = TFO_ATTEMPTED_NODATA; /* we tried; unknown if useful yet */ - rc = 0; - } - else - rc = send(sock, fastopen_blob->data, fastopen_blob->len, 0); - } - else if(errno == EOPNOTSUPP) - { - DEBUG(D_transport) - debug_printf("Tried TCP Fast Open but apparently not enabled by sysctl\n"); - goto legacy_connect; + DEBUG(D_transport|D_v) debug_printf(" TFO mode sendto, %s data: EINPROGRESS\n", + fastopen_blob->len > 0 ? "with" : "no"); + if (!fastopen_blob->data) + { + tcp_out_fastopen = TFO_ATTEMPTED_NODATA; /* we tried; unknown if useful yet */ + rc = 0; + } + else /* queue unsent data */ + rc = send(sock, fastopen_blob->data, fastopen_blob->len, 0); + break; + + case EOPNOTSUPP: + DEBUG(D_transport) + debug_printf("Tried TCP Fast Open but apparently not enabled by sysctl\n"); + goto legacy_connect; + + case EPIPE: + DEBUG(D_transport) + debug_printf("Tried TCP Fast Open but kernel too old to support it\n"); + goto legacy_connect; } # elif defined(EXIM_TFO_FREEBSD) |