From eecb86bfb0cd0fada5bdeb3c8d069f194b08208b Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Tue, 8 Jan 2002 23:19:32 +0000
Subject: [PATCH] this seems to correct the SSL reading problem introduced when
 switching over to non-blocking sockets, but this loops very nastily. We
 should return back to the select() and wait there until more data arrives,
 not just blindly attempt again and again...

---
 lib/sendf.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/lib/sendf.c b/lib/sendf.c
index ad144edd88..78581f5855 100644
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@ -279,13 +279,28 @@ CURLcode Curl_read(struct connectdata *conn, int sockfd,
 
 #ifdef USE_SSLEAY
   if (conn->ssl.use) {
-    int loop=100; /* just a precaution to never loop endlessly */
-    while(loop--) {
+    bool loop=TRUE;
+    int err;
+    do {
       nread = SSL_read(conn->ssl.handle, buf, buffersize);
-      if((-1 != nread) ||
-         (SSL_ERROR_WANT_READ != SSL_get_error(conn->ssl.handle, nread) ))
+
+      if(nread > 0)
+        /* successful read */
         break;
-    }
+
+      err = SSL_get_error(conn->ssl.handle, nread);
+
+      switch(err) {
+      case SSL_ERROR_NONE: /* this is not an error */
+      case SSL_ERROR_ZERO_RETURN: /* no more data */
+        loop=0; /* get out of loop */
+        break;
+      case SSL_ERROR_WANT_READ:
+      case SSL_ERROR_WANT_WRITE:
+        /* if there's data pending, then we re-invoke SSL_read() */
+        break;
+      }
+    } while(loop && SSL_pending(conn->ssl.handle));
   }
   else {
 #endif
-- 
GitLab