summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2018-01-27 15:03:01 +0000
committerJeremy Harris <jgh146exb@wizmail.org>2018-01-27 15:11:09 +0000
commit4b8ff36089f93f3315b94da2bdb68285340790a7 (patch)
tree4119b8d7b87ef78493cfc9a09624df68f0c23a75
parentbaabef80f200a5e028a6f1487276a441caa40255 (diff)
downloadexim4-4b8ff36089f93f3315b94da2bdb68285340790a7.tar.gz
GnuTLS: fix to ignore timeout on unrelated callout connection. Bug 2174
-rw-r--r--doc/doc-txt/ChangeLog6
-rw-r--r--src/src/tls-gnu.c5
2 files changed, 8 insertions, 3 deletions
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index f41932c00..22f65c872 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -52,6 +52,12 @@ JH/13 Bug 2229: Fix cutthrough routing for nonstandard port numbers defined by
routers. Previously, a multi-recipient message would fail to match the
onward-connection opened for the first recipient, and cause its closure.
+JH/14 Bug 2174: A timeout on connect for a callout was also erroneously seen as
+ a timeout on read on a GnuTLS initiating connection, resulting in the
+ initiating connection being dropped. This mattered most when the callout
+ was marked defer_ok. Fix to keep the two timeout-detection methods
+ separate.
+
Exim version 4.90
-----------------
diff --git a/src/src/tls-gnu.c b/src/src/tls-gnu.c
index 527ad28b2..fc3aba59f 100644
--- a/src/src/tls-gnu.c
+++ b/src/src/tls-gnu.c
@@ -2105,10 +2105,8 @@ DEBUG(D_tls) debug_printf("about to gnutls_handshake\n");
sigalrm_seen = FALSE;
alarm(ob->command_timeout);
do
- {
rc = gnutls_handshake(state->session);
- } while ((rc == GNUTLS_E_AGAIN) ||
- (rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen));
+while (rc == GNUTLS_E_AGAIN || rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen);
alarm(0);
if (rc != GNUTLS_E_SUCCESS)
@@ -2225,6 +2223,7 @@ ssize_t inbytes;
DEBUG(D_tls) debug_printf("Calling gnutls_record_recv(%p, %p, %u)\n",
state->session, state->xfer_buffer, ssl_xfer_buffer_size);
+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));