From ca82afbfb7ee9a083d13c7861408e5759f2509cd Mon Sep 17 00:00:00 2001 From: Ludovic Fauvet Date: Thu, 7 Feb 2013 17:21:06 +0100 Subject: [PATCH] gnutls: retry handshake if it returns a non-fatal error Based on the gnutls_handshake manual the function must be called again until it returns 0 (or a fatal error). Signed-off-by: Jean-Baptiste Kempf --- modules/misc/gnutls.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/modules/misc/gnutls.c b/modules/misc/gnutls.c index 312c682422..e4702809bc 100644 --- a/modules/misc/gnutls.c +++ b/modules/misc/gnutls.c @@ -229,9 +229,16 @@ static int gnutls_ContinueHandshake (vlc_tls_t *session, const char *host, #ifdef WIN32 WSASetLastError (0); #endif - val = gnutls_handshake (sys->session); - if ((val == GNUTLS_E_AGAIN) || (val == GNUTLS_E_INTERRUPTED)) - return 1 + gnutls_record_get_direction (sys->session); + do + { + val = gnutls_handshake (sys->session); + msg_Dbg (session, "TLS handshake: %s", gnutls_strerror (val)); + + if ((val == GNUTLS_E_AGAIN) || (val == GNUTLS_E_INTERRUPTED)) + /* I/O event: return to caller's poll() loop */ + return 1 + gnutls_record_get_direction (sys->session); + } + while (val < 0 && !gnutls_error_is_fatal (val)); if (val < 0) { -- 2.11.4.GIT