[exim-cvs] GnuTLS: repeat lowlevel read and write operations…

Inizio della pagina
Delete this message
Reply to this message
Autore: Exim Git Commits Mailing List
Data:  
To: exim-cvs
Oggetto: [exim-cvs] GnuTLS: repeat lowlevel read and write operations while they request retry
Gitweb: https://git.exim.org/exim.git/commitdiff/06faf21f3a84a3ac4aa4f7b1512087423d8c8541
Commit:     06faf21f3a84a3ac4aa4f7b1512087423d8c8541
Parent:     db3f7b6972f3b003c0413b78afcfbe295ffe0b97
Author:     Andreas Metzler <ametzler@???>
AuthorDate: Mon Dec 24 16:11:41 2018 +0000
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Mon Dec 24 16:22:11 2018 +0000


    GnuTLS: repeat lowlevel read and write operations while they request retry
---
 doc/doc-txt/ChangeLog |  3 ++-
 src/src/tls-gnu.c     | 28 +++++++++++++++++++---------
 2 files changed, 21 insertions(+), 10 deletions(-)


diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index e527eeb..db6df25 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -8,7 +8,8 @@ options, and new features, see the NewStuff file next to this ChangeLog.
Exim version 4.93
-----------------

-JH/01 Bug 2351: Log failures to extract envelope addresses from message headers.
+JH/01 GnuTLS: repeat lowlevel read and write operations while they return error
+      codes indicating retry.  Under TLS1.3 this becomes required.



Exim version 4.92
diff --git a/src/src/tls-gnu.c b/src/src/tls-gnu.c
index dd58624..e5a5fab 100644
--- a/src/src/tls-gnu.c
+++ b/src/src/tls-gnu.c
@@ -2561,8 +2561,12 @@ DEBUG(D_tls) debug_printf("Calling gnutls_record_recv(%p, %p, %u)\n",

 sigalrm_seen = FALSE;
 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
-inbytes = gnutls_record_recv(state->session, state->xfer_buffer,
-  MIN(ssl_xfer_buffer_size, lim));
+
+do
+  inbytes = gnutls_record_recv(state->session, state->xfer_buffer,
+    MIN(ssl_xfer_buffer_size, lim));
+while (inbytes == GNUTLS_E_AGAIN);
+
 if (smtp_receive_timeout > 0) ALARM_CLR(0);


 if (had_command_timeout)        /* set by signal handler */
@@ -2617,7 +2621,7 @@ else if (inbytes == 0)


 else if (inbytes < 0)
   {
-debug_printf("%s: err from gnutls_record_recv(\n", __FUNCTION__);
+  DEBUG(D_tls) debug_printf("%s: err from gnutls_record_recv(\n", __FUNCTION__);
   record_io_error(state, (int) inbytes, US"recv", NULL);
   state->xfer_error = TRUE;
   return FALSE;
@@ -2739,17 +2743,20 @@ DEBUG(D_tls)
   debug_printf("Calling gnutls_record_recv(%p, %p, " SIZE_T_FMT ")\n",
       state->session, buff, len);


-inbytes = gnutls_record_recv(state->session, buff, len);
+do
+ inbytes = gnutls_record_recv(state->session, buff, len);
+while (inbytes == GNUTLS_E_AGAIN);
+
if (inbytes > 0) return inbytes;
if (inbytes == 0)
{
DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
}
else
-{
-debug_printf("%s: err from gnutls_record_recv(\n", __FUNCTION__);
-record_io_error(state, (int)inbytes, US"recv", NULL);
-}
+ {
+ DEBUG(D_tls) debug_printf("%s: err from gnutls_record_recv(\n", __FUNCTION__);
+ record_io_error(state, (int)inbytes, US"recv", NULL);
+ }

 return -1;
 }
@@ -2791,7 +2798,10 @@ while (left > 0)
   {
   DEBUG(D_tls) debug_printf("gnutls_record_send(SSL, %p, " SIZE_T_FMT ")\n",
       buff, left);
-  outbytes = gnutls_record_send(state->session, buff, left);
+
+  do
+    outbytes = gnutls_record_send(state->session, buff, left);
+  while (outbytes == GNUTLS_E_AGAIN);


DEBUG(D_tls) debug_printf("outbytes=" SSIZE_T_FMT "\n", outbytes);
if (outbytes < 0)