]> granicus.if.org Git - curl/commitdiff
this seems to correct the SSL reading problem introduced when switching
authorDaniel Stenberg <daniel@haxx.se>
Tue, 8 Jan 2002 23:19:32 +0000 (23:19 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 8 Jan 2002 23:19:32 +0000 (23:19 +0000)
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

index ad144edd884c25ffafa1a617d9bb2e313467b713..78581f5855cad47ab0bdac58583ee979ccd0a411 100644 (file)
@@ -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