From 3afb07f2c63fb6dc3983b28e7cdaf11fceb741d1 Mon Sep 17 00:00:00 2001 From: "Heiko Schlittermann (HS12-RIPE)" 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