fixed ssl.c bug when ssl backend returns IO_BLOCKED but IO engine doesn't get informe...
[ircu2.10.12-pk.git] / ircd / ssl.c
index 49e861f75cc20178c5403d4bc9f39c281e7454b6..489c143f4b632f23d9f2626c03a6659c168ca757 100644 (file)
@@ -866,7 +866,8 @@ const char *ssl_cipherstr(ssl_session_t *ssl) {
 
 
 
 
 
 
-#ifdef HAVE_GNUTLS
+#if defined(HAVE_GNUTLS)
+
     unsigned int ssl_be_init() {
         signed int ret;
         if((ret = gnutls_global_init()) != GNUTLS_E_SUCCESS) {
     unsigned int ssl_be_init() {
         signed int ret;
         if((ret = gnutls_global_init()) != GNUTLS_E_SUCCESS) {
@@ -1021,15 +1022,25 @@ const char *ssl_cipherstr(ssl_session_t *ssl) {
     }
     IOResult ssl_be_send(signed int fd, ssl_be_session_t *ssl, const char *buf, unsigned int *count_out) {
         signed int res;
     }
     IOResult ssl_be_send(signed int fd, ssl_be_session_t *ssl, const char *buf, unsigned int *count_out) {
         signed int res;
+               ssl_msg(SSL_DEBUG, "SSL: gnutls ssl_be_send(): %s", buf);
         res = gnutls_record_send(*ssl, buf, *count_out);
         *count_out = 0;
         res = gnutls_record_send(*ssl, buf, *count_out);
         *count_out = 0;
-        if(res == 0) return IO_FAILURE;
+        if(res == 0) {
+                       ssl_msg(SSL_DEBUG, "SSL: gnutls ssl_be_send(): failed (IO_FAILURE)");
+                       return IO_FAILURE;
+               }
         else if(res < 0) {
         else if(res < 0) {
-            if(res != GNUTLS_E_AGAIN && res != GNUTLS_E_INTERRUPTED) return IO_FAILURE;
-            else return IO_BLOCKED;
+            if(res != GNUTLS_E_AGAIN && res != GNUTLS_E_INTERRUPTED) {
+                               ssl_msg(SSL_DEBUG, "SSL: gnutls ssl_be_send(): failed (IO_FAILURE)");
+                               return IO_FAILURE;
+            } else {
+                               ssl_msg(SSL_DEBUG, "SSL: gnutls ssl_be_send(): failed (IO_BLOCKED)");
+                               return IO_BLOCKED;
+                       }
         }
         else {
             *count_out = res;
         }
         else {
             *count_out = res;
+                       ssl_msg(SSL_DEBUG, "SSL: gnutls ssl_be_send(): successful (IO_SUCCESS) %d", res);
             return IO_SUCCESS;
         }
     }
             return IO_SUCCESS;
         }
     }
@@ -1037,13 +1048,22 @@ const char *ssl_cipherstr(ssl_session_t *ssl) {
         signed int res;
         res = gnutls_record_recv(*ssl, buf, *count_out);
         *count_out = 0;
         signed int res;
         res = gnutls_record_recv(*ssl, buf, *count_out);
         *count_out = 0;
-        if(res == 0) return IO_FAILURE;
+        if(res == 0) {
+                       ssl_msg(SSL_DEBUG, "SSL: gnutls ssl_be_recv(): failed (IO_FAILURE)");
+                       return IO_FAILURE;
+               }
         else if(res < 0) {
         else if(res < 0) {
-            if(res == GNUTLS_E_AGAIN || res == GNUTLS_E_INTERRUPTED) return IO_BLOCKED;
-            else return IO_FAILURE;
+            if(res == GNUTLS_E_AGAIN || res == GNUTLS_E_INTERRUPTED) {
+                               ssl_msg(SSL_DEBUG, "SSL: gnutls ssl_be_recv(): failed (IO_BLOCKED)");
+                               return IO_BLOCKED;
+            } else {
+                               ssl_msg(SSL_DEBUG, "SSL: gnutls ssl_be_recv(): failed (IO_FAILURE)");
+                               return IO_FAILURE;
+                       }
         }
         else {
             *count_out = res;
         }
         else {
             *count_out = res;
+                       ssl_msg(SSL_DEBUG, "SSL: gnutls ssl_be_recv(): successful (IO_SUCCESS)");
             return IO_SUCCESS;
         }
     }
             return IO_SUCCESS;
         }
     }