From bc7fe85f8a907673b5c91a8d92fdc0f1a08e4de0 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Fri, 6 Jun 2003 14:56:50 +0000
Subject: [PATCH] Just moved around some logic in Curl_write() to make it
 easier to debug.

---
 lib/sendf.c | 46 ++++++++++++++++++++++++++++++++--------------
 1 file changed, 32 insertions(+), 14 deletions(-)

diff --git a/lib/sendf.c b/lib/sendf.c
index 1538061e84..efb89f2057 100644
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@ -94,7 +94,6 @@ struct curl_slist *curl_slist_append(struct curl_slist *list,
     new_item->data = strdup(data);
   }
   if (new_item == NULL || new_item->data == NULL) {
-    fprintf(stderr, "Cannot allocate memory for QUOTE list.\n");
     return NULL;
   }
 
@@ -229,6 +228,7 @@ CURLcode Curl_write(struct connectdata *conn, int sockfd,
                     ssize_t *written)
 {
   ssize_t bytes_written;
+  CURLcode retcode;
   (void)conn;
 
 #ifdef USE_SSLEAY
@@ -244,13 +244,28 @@ CURLcode Curl_write(struct connectdata *conn, int sockfd,
       switch(err) {
       case SSL_ERROR_WANT_READ:
       case SSL_ERROR_WANT_WRITE:
-        /* this is basicly the EWOULDBLOCK equivalent */
+        /* The operation did not complete; the same TLS/SSL I/O function
+           should be called again later. This is basicly an EWOULDBLOCK
+           equivalent. */
         *written = 0;
         return CURLE_OK;
       case SSL_ERROR_SYSCALL:
         failf(conn->data, "SSL_write() returned SYSCALL, errno = %d\n",
               Curl_ourerrno());
         return CURLE_SEND_ERROR;
+      case SSL_ERROR_SSL:
+      {
+        /*  A failure in the SSL library occurred, usually a
+            protocol error.  The OpenSSL error queue contains more
+            information on the error. */
+        char error_buffer[120]; /* OpenSSL documents that this must be at least
+                                   120 bytes long. */
+        int sslerror = ERR_get_error();
+        failf(conn->data, "SSL_write() error: %s\n",
+              ERR_error_string(sslerror, error_buffer));
+        return CURLE_SEND_ERROR;
+      }
+        break;
       }
       /* a true error */
       failf(conn->data, "SSL_write() return error %d\n", err);
@@ -271,27 +286,30 @@ CURLcode Curl_write(struct connectdata *conn, int sockfd,
     }
     if(-1 == bytes_written) {
       int err = Curl_ourerrno();
-#ifdef WIN32
-      if(WSAEWOULDBLOCK == err)
+
+      if(
+#ifdef WSAEWOULDBLOCK
+        /* This is how Windows does it */
+        (WSAEWOULDBLOCK == err)
 #else
-      /* As pointed out by Christophe Demory on March 11 2003, errno
-         may be EWOULDBLOCK or on some systems EAGAIN when it returned
-         due to its inability to send off data without blocking. We
-         therefor treat both error codes the same here */
-      if((EWOULDBLOCK == err) || (EAGAIN == err) || (EINTR == err))
+        /* As pointed out by Christophe Demory on March 11 2003, errno
+           may be EWOULDBLOCK or on some systems EAGAIN when it returned
+           due to its inability to send off data without blocking. We
+           therefor treat both error codes the same here */
+        (EWOULDBLOCK == err) || (EAGAIN == err) || (EINTR == err)
 #endif
-      {
+        )
         /* this is just a case of EWOULDBLOCK */
-        *written=0;
-        return CURLE_OK;
-      }
+        bytes_written=0;
     }
 #ifdef USE_SSLEAY
   }
 #endif
 
   *written = bytes_written;
-  return (-1 != bytes_written)?CURLE_OK:CURLE_SEND_ERROR;
+  retcode = (-1 != bytes_written)?CURLE_OK:CURLE_SEND_ERROR;
+
+  return retcode;
 }
 
 /* client_write() sends data to the write callback(s)
-- 
GitLab