瀏覽代碼

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

Tatsuhiro Tsujikawa 11 年之前
父節點
當前提交
e81dd84641
共有 1 個文件被更改,包括 18 次插入10 次删除
  1. 18 10
      src/LibgnutlsTLSSession.cc

+ 18 - 10
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;
+    }
   }
 }