Merge branch 'debian'
[hcoop/debian/exim4.git] / debian / patches / 80_03-GnuTLS-Do-not-care-about-corked-data-when-uncorking.patch
diff --git a/debian/patches/80_03-GnuTLS-Do-not-care-about-corked-data-when-uncorking.patch b/debian/patches/80_03-GnuTLS-Do-not-care-about-corked-data-when-uncorking.patch
new file mode 100644 (file)
index 0000000..da8748f
--- /dev/null
@@ -0,0 +1,55 @@
+From 3afb07f2c63fb6dc3983b28e7cdaf11fceb741d1 Mon Sep 17 00:00:00 2001
+From: "Heiko Schlittermann (HS12-RIPE)" <hs@schlittermann.de>
+Date: Mon, 2 Mar 2020 22:56:32 +0100
+Subject: [PATCH 6/6] GnuTLS: Do not care about corked data when uncorking
+
+(cherry picked from commit d8d7e3a4162b52382daf8319f221c085c76c5b8f)
+---
+ src/tls-gnu.c | 31 +++++++++++++++----------------
+ 1 file changed, 15 insertions(+), 16 deletions(-)
+
+diff --git a/src/tls-gnu.c b/src/tls-gnu.c
+index 94a718673..2091e44db 100644
+--- a/src/tls-gnu.c
++++ b/src/tls-gnu.c
+@@ -2887,22 +2887,21 @@ if (len > INT_MAX)
+ if (!more && state->corked)
+   {
+   DEBUG(D_tls) debug_printf("gnutls_record_uncork(session=%p)\n", state->session);
+-  do {
+-    do
+-      /* We can't use GNUTLS_RECORD_WAIT here, as it retries on
+-      GNUTLS_E_AGAIN || GNUTLS_E_INTR, which would break our timeout set by alarm().
+-      The GNUTLS_E_AGAIN should not happen ever, as our sockets are blocking anyway.
+-      But who knows. (That all relies on the fact that GNUTLS_E_INTR and GNUTLS_E_AGAIN
+-      match the EINTR and EAGAIN errno values.) */
+-      outbytes = gnutls_record_uncork(state->session, 0);
+-    while (outbytes == GNUTLS_E_AGAIN);
+-
+-     if (outbytes < 0)
+-       {
+-       record_io_error(state, len, US"uncork", NULL);
+-       return -1;
+-       }
+-  } while (gnutls_record_check_corked(state->session) > 0);
++  do
++    /* We can't use GNUTLS_RECORD_WAIT here, as it retries on
++    GNUTLS_E_AGAIN || GNUTLS_E_INTR, which would break our timeout set by alarm().
++    The GNUTLS_E_AGAIN should not happen ever, as our sockets are blocking anyway.
++    But who knows. (That all relies on the fact that GNUTLS_E_INTR and GNUTLS_E_AGAIN
++    match the EINTR and EAGAIN errno values.) */
++    outbytes = gnutls_record_uncork(state->session, 0);
++  while (outbytes == GNUTLS_E_AGAIN);
++
++  if (outbytes < 0)
++    {
++    record_io_error(state, len, US"uncork", NULL);
++    return -1;
++    }
++
+   state->corked = FALSE;
+   }
+ #endif
+-- 
+2.28.0
+