gnutls: Don't fail handshake if returned error is not fatal

pull/186/head
Tatsuhiro Tsujikawa 2014-01-08 23:11:56 +09:00
parent 3c789294b7
commit e81dd84641
1 changed files with 18 additions and 10 deletions

View File

@ -181,11 +181,15 @@ int GnuTLSSession::tlsConnect(const std::string& hostname,
std::string& handshakeErr) std::string& handshakeErr)
{ {
handshakeErr = ""; handshakeErr = "";
rv_ = gnutls_handshake(sslSession_); for(;;) {
if(rv_ < 0) { rv_ = gnutls_handshake(sslSession_);
if(rv_ == GNUTLS_E_SUCCESS) {
break;
}
if(rv_ == GNUTLS_E_AGAIN || rv_ == GNUTLS_E_INTERRUPTED) { if(rv_ == GNUTLS_E_AGAIN || rv_ == GNUTLS_E_INTERRUPTED) {
return TLS_ERR_WOULDBLOCK; return TLS_ERR_WOULDBLOCK;
} else { }
if(gnutls_error_is_fatal(rv_)) {
return TLS_ERR_ERROR; return TLS_ERR_ERROR;
} }
} }
@ -279,13 +283,17 @@ int GnuTLSSession::tlsConnect(const std::string& hostname,
int GnuTLSSession::tlsAccept() int GnuTLSSession::tlsAccept()
{ {
rv_ = gnutls_handshake(sslSession_); for(;;) {
if(rv_ == GNUTLS_E_SUCCESS) { rv_ = gnutls_handshake(sslSession_);
return TLS_ERR_OK; if(rv_ == GNUTLS_E_SUCCESS) {
} else if(rv_ == GNUTLS_E_AGAIN || rv_ == GNUTLS_E_INTERRUPTED) { return TLS_ERR_OK;
return TLS_ERR_WOULDBLOCK; }
} else { if(rv_ == GNUTLS_E_AGAIN || rv_ == GNUTLS_E_INTERRUPTED) {
return TLS_ERR_ERROR; return TLS_ERR_WOULDBLOCK;
}
if(gnutls_error_is_fatal(rv_)) {
return TLS_ERR_ERROR;
}
} }
} }