diff options
-rw-r--r-- | CHANGES | 4 | ||||
-rw-r--r-- | src/tidy_tls.c | 28 |
2 files changed, 25 insertions, 7 deletions
diff --git a/CHANGES b/CHANGES index da7678f0..1465de98 100644 --- a/CHANGES +++ b/CHANGES @@ -1,9 +1,11 @@ --- $LynxId: CHANGES,v 1.1003 2018/12/29 00:36:37 tom Exp $ +-- $LynxId: CHANGES,v 1.1004 2018/12/29 01:32:29 tom Exp $ =============================================================================== Changes since Lynx 2.8 release =============================================================================== 2018-12-28 (2.9.0dev.1) +* modify tidy_tls.c to work with TLS 1.3 when built with gnutls 3.6.5 or later + (patch by Andreas Metzler). * add to experimental Japanese UTF-8 feature -KH + fix JIS X 0201 Katakana conversion from Shift_JIS/EUC-JP to UTF-8. http://www1.interq.or.jp/~deton/lynx-sjisjisx0201/ diff --git a/src/tidy_tls.c b/src/tidy_tls.c index aa8be758..cda9a407 100644 --- a/src/tidy_tls.c +++ b/src/tidy_tls.c @@ -1,6 +1,6 @@ /* - * $LynxId: tidy_tls.c,v 1.35 2016/11/24 18:48:02 tom Exp $ - * Copyright 2008-2015,2016 Thomas E. Dickey + * $LynxId: tidy_tls.c,v 1.37 2018/12/29 01:41:39 tom Exp $ + * Copyright 2008-2016,2018 Thomas E. Dickey * with fix Copyright 2008 by Thomas Viehmann * * Required libraries: @@ -462,13 +462,26 @@ int SSL_read(SSL * ssl, void *buffer, int length) { int rc; - rc = (int) gnutls_record_recv(ssl->gnutls_state, buffer, (size_t) length); + do { + rc = (int) gnutls_record_recv(ssl->gnutls_state, buffer, (size_t) length); + } + while ((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED)); if (rc < 0 && gnutls_error_is_fatal(rc) == 0) { if (rc == GNUTLS_E_REHANDSHAKE) { (void) gnutls_handshake(ssl->gnutls_state); - gnutls_record_send(ssl->gnutls_state, ssl->sendbuffer, (size_t) ssl->bytes_sent); - rc = (int) gnutls_record_recv(ssl->gnutls_state, buffer, (size_t) length); + do { + rc = (int) gnutls_record_send(ssl->gnutls_state, + ssl->sendbuffer, + (size_t) ssl->bytes_sent); + } + while ((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED)); + do { + rc = (int) gnutls_record_recv(ssl->gnutls_state, + buffer, + (size_t) length); + } + while ((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED)); } } @@ -500,7 +513,10 @@ int SSL_write(SSL * ssl, const void *buffer, int length) { int rc; - rc = (int) gnutls_record_send(ssl->gnutls_state, buffer, (size_t) length); + do { + rc = (int) gnutls_record_send(ssl->gnutls_state, buffer, (size_t) length); + } + while ((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED)); ssl->last_error = rc; if (rc < 0) { |