[exim-cvs] TFO: even in binary built for modern Linux, hand…

Αρχική Σελίδα
Delete this message
Reply to this message
Συντάκτης: Exim Git Commits Mailing List
Ημερομηνία:  
Προς: exim-cvs
Αντικείμενο: [exim-cvs] TFO: even in binary built for modern Linux, handle error returned by old Linux kernel. Bug 2518
Gitweb: https://git.exim.org/exim.git/commitdiff/c3da38a12a2372a7f6a48be97ebfd80aeceda828
Commit:     c3da38a12a2372a7f6a48be97ebfd80aeceda828
Parent:     3af060926c5d1c0786a446762c333c91f0665187
Author:     Brian Foley <bpfoley@???>
AuthorDate: Sat Jan 25 15:27:49 2020 +0000
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Sat Jan 25 15:27:49 2020 +0000


    TFO: even in binary built for modern Linux, handle error returned by old Linux kernel.  Bug 2518
---
 src/src/ip.c | 40 +++++++++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 17 deletions(-)


diff --git a/src/src/ip.c b/src/src/ip.c
index a6b7de3..4c54356 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)