summaryrefslogtreecommitdiff
path: root/src/LibgnutlsTLSSession.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/LibgnutlsTLSSession.cc')
-rw-r--r--src/LibgnutlsTLSSession.cc28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/LibgnutlsTLSSession.cc b/src/LibgnutlsTLSSession.cc
index 5cc78aa5..21f9549a 100644
--- a/src/LibgnutlsTLSSession.cc
+++ b/src/LibgnutlsTLSSession.cc
@@ -181,11 +181,15 @@ int GnuTLSSession::tlsConnect(const std::string& hostname,
std::string& handshakeErr)
{
handshakeErr = "";
- rv_ = gnutls_handshake(sslSession_);
- if(rv_ < 0) {
+ for(;;) {
+ rv_ = gnutls_handshake(sslSession_);
+ if(rv_ == GNUTLS_E_SUCCESS) {
+ break;
+ }
if(rv_ == GNUTLS_E_AGAIN || rv_ == GNUTLS_E_INTERRUPTED) {
return TLS_ERR_WOULDBLOCK;
- } else {
+ }
+ if(gnutls_error_is_fatal(rv_)) {
return TLS_ERR_ERROR;
}
}
@@ -279,13 +283,17 @@ int GnuTLSSession::tlsConnect(const std::string& hostname,
int GnuTLSSession::tlsAccept()
{
- rv_ = gnutls_handshake(sslSession_);
- if(rv_ == GNUTLS_E_SUCCESS) {
- return TLS_ERR_OK;
- } else if(rv_ == GNUTLS_E_AGAIN || rv_ == GNUTLS_E_INTERRUPTED) {
- return TLS_ERR_WOULDBLOCK;
- } else {
- return TLS_ERR_ERROR;
+ for(;;) {
+ rv_ = gnutls_handshake(sslSession_);
+ if(rv_ == GNUTLS_E_SUCCESS) {
+ return TLS_ERR_OK;
+ }
+ if(rv_ == GNUTLS_E_AGAIN || rv_ == GNUTLS_E_INTERRUPTED) {
+ return TLS_ERR_WOULDBLOCK;
+ }
+ if(gnutls_error_is_fatal(rv_)) {
+ return TLS_ERR_ERROR;
+ }
}
}