--- src/tidy_tls.c +++ src/tidy_tls.c @@ -461,14 +461,22 @@ { int rc; - rc = (int) gnutls_record_recv(ssl->gnutls_state, buffer, (size_t) length); + for(;;) { + rc = (int) gnutls_record_recv(ssl->gnutls_state, buffer, (size_t) length); - 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); - } + 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); + continue; + } else if (rc == GNUTLS_E_AGAIN || GNUTLS_E_INTERRUPTED) { + continue; + } + /* not handled gnutls non-fatal error */ + break; + } else + /* rc >= 0 or gnutls fatal error */ + break; } ssl->last_error = rc;