]> granicus.if.org Git - curl/commitdiff
Added an additional SSL check for a dead socket before we re-use an SSL
authorDaniel Stenberg <daniel@haxx.se>
Tue, 30 Oct 2001 15:21:45 +0000 (15:21 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 30 Oct 2001 15:21:45 +0000 (15:21 +0000)
connection. The simple socket-check is not enough in these cases.

lib/url.c

index e16766fce88d3aa526041fa03379a32a3989c94d..bd01136d8dab20021b9996b995869b9f5ed89086 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -935,7 +935,7 @@ CURLcode Curl_disconnect(struct connectdata *conn)
  * be dead. Most commonly this happens when the server has closed the
  * connection due to inactivity.
  */
-static bool SocketIsDead(int sock) 
+static bool SocketIsDead(struct connectdata *conn, int sock) 
 { 
   int sval; 
   bool ret_val = TRUE; 
@@ -949,9 +949,17 @@ static bool SocketIsDead(int sock)
   to.tv_usec = 1; 
 
   sval = select(sock + 1, &check_set, 0, 0, &to);
-  if(sval == 0) 
+  if(sval == 0) {
     /* timeout */
-    ret_val = FALSE; 
+    ret_val = FALSE;
+#ifdef USE_SSLEAY
+    /* the socket seems fine, but is the SSL later fine too? */
+    if(conn->ssl.use) {
+      if(SSL_get_shutdown(conn->ssl.handle))
+        return TRUE; /* this connection is dead! */
+    }
+#endif
+  }
   
   return ret_val;
 }
@@ -994,7 +1002,7 @@ ConnectionExists(struct SessionHandle *data,
             continue;
           }
         }
-        dead = SocketIsDead(check->firstsocket);
+        dead = SocketIsDead(check, check->firstsocket);
         if(dead) {
           infof(data, "Connection %d seems to be dead!\n", i);
           Curl_disconnect(check); /* disconnect resources */