Browse Source

* Better SSL error reporting/handling

Bryan Drewery 15 years ago
parent
commit
ae148a4e7c
1 changed files with 45 additions and 3 deletions
  1. 45 3
      src/net.c

+ 45 - 3
src/net.c

@@ -1058,7 +1058,7 @@ static int sockread(char *s, int *len)
 #ifdef EGG_SSL_EXT
         } else if (socklist[i].ssl) {
             x = SSL_read(socklist[i].ssl,s,grab);
-            if (x < 0) {
+            if (x <= 0) {
               int err = SSL_get_error(socklist[i].ssl, x);
               x = -1;
               switch (err) {
@@ -1067,6 +1067,20 @@ static int sockread(char *s, int *len)
                 case SSL_ERROR_WANT_X509_LOOKUP:
                   errno = EAGAIN;
                   break;
+                case SSL_ERROR_SYSCALL:
+                  switch (ERR_get_error()) {
+                    case 0:
+                      // EOF
+                      break;
+                    case -1:
+                      // I/O error
+                      putlog(LOG_DEBUG, "*", "SSL_read() [IO] = %d, %s", err, (char *)ERR_error_string(ERR_get_error(), NULL));
+                      break;
+                    default:
+                      putlog(LOG_DEBUG, "*", "SSL_read() unknown error: %s", strerror(errno));
+                      break;
+                  }
+                  break;
                 case SSL_ERROR_SSL:
                   putlog(LOG_DEBUG, "*", "SSL_read() = %d, %s", err, (char *)ERR_error_string(ERR_get_error(), NULL));
                   break;
@@ -1363,7 +1377,7 @@ void tputs(register int z, const char *s, size_t len)
 #ifdef EGG_SSL_EXT
     if (socklist[i].ssl) {
       x = SSL_write(socklist[i].ssl,s,len);
-      if (x < 0) {
+      if (x <= 0) {
         int err = SSL_get_error(socklist[i].ssl, x);
         x = -1;
         switch (err) {
@@ -1372,6 +1386,20 @@ void tputs(register int z, const char *s, size_t len)
           case SSL_ERROR_WANT_X509_LOOKUP:
             errno = EAGAIN;
             break;
+          case SSL_ERROR_SYSCALL:
+            switch (ERR_get_error()) {
+              case 0:
+                // EOF
+                break;
+              case -1:
+                // I/O error
+                putlog(LOG_DEBUG, "*", "SSL_write() [IO] = %d, %s", err, (char *)ERR_error_string(ERR_get_error(), NULL));
+                break;
+              default:
+                putlog(LOG_DEBUG, "*", "SSL_write() unknown error: %s", strerror(errno));
+                break;
+            }
+            break;
           case SSL_ERROR_SSL:
             putlog(LOG_DEBUG, "*", "SSL_write() = %d, %s", err, (char *)ERR_error_string(ERR_get_error(), NULL));
             break;
@@ -1472,7 +1500,7 @@ void dequeue_sockets()
 #ifdef EGG_SSL_EXT
       if (socklist[i].ssl) {
            x = SSL_write(socklist[i].ssl, socklist[i].outbuf->data(), socklist[i].outbuf->length());
-           if (x < 0) {
+           if (x <= 0) {
              int err = SSL_get_error(socklist[i].ssl, x);
              x = -1;
              switch (err) {
@@ -1481,6 +1509,20 @@ void dequeue_sockets()
                case SSL_ERROR_WANT_X509_LOOKUP:
                  errno = EAGAIN;
                  break;
+               case SSL_ERROR_SYSCALL:
+                 switch (ERR_get_error()) {
+                   case 0:
+                     // EOF
+                     break;
+                   case -1:
+                     // I/O error
+                     putlog(LOG_DEBUG, "*", "SSL_write()/dequeue_sockets() [IO] = %d, %s", err, (char *)ERR_error_string(ERR_get_error(), NULL));
+                     break;
+                   default:
+                     putlog(LOG_DEBUG, "*", "SSL_write() unknown error: %s", strerror(errno));
+                     break;
+                 }
+                 break;
                case SSL_ERROR_SSL:
                  putlog(LOG_DEBUG, "*", "SSL_write()/dequeue_sockets() = %d, %s", err, (char *)ERR_error_string(ERR_get_error(), NULL));
                  break;