]> granicus.if.org Git - curl/commitdiff
getsessionid: don't ever return while locked
authorDaniel Stenberg <daniel@haxx.se>
Thu, 17 Nov 2011 22:55:36 +0000 (23:55 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 17 Nov 2011 22:57:21 +0000 (23:57 +0100)
Also, check for the session sharing bit instead of comparing pointers

lib/sslgen.c

index 23c07e73b57900460cd677ec194b5175d5e38869..b9176b76c5083b0b84e99b582bb4082a1a9a88c5 100644 (file)
@@ -233,14 +233,18 @@ int Curl_ssl_getsessionid(struct connectdata *conn,
   struct SessionHandle *data = conn->data;
   long i;
   long *general_age;
+  bool no_match = TRUE;
+
+  *ssl_sessionid = NULL;
 
   if(!conn->ssl_config.sessionid)
     /* session ID re-use is disabled */
     return TRUE;
 
-  /* Lock for reading if shared */
-  if(data->share && data->share->sslsession == data->state.session) {
-    Curl_share_lock(data, CURL_LOCK_DATA_SSL_SESSION, CURL_LOCK_ACCESS_SHARED);
+  /* Lock if shared */
+  if(data->share &&
+     (data->share->specifier & (1<<CURL_LOCK_DATA_SSL_SESSION)) ) {
+    Curl_share_lock(data, CURL_LOCK_DATA_SSL_SESSION, CURL_LOCK_ACCESS_SINGLE);
     general_age = &data->share->sessionage;
   }
   else
@@ -260,17 +264,17 @@ int Curl_ssl_getsessionid(struct connectdata *conn,
       *ssl_sessionid = check->sessionid;
       if(idsize)
         *idsize = check->idsize;
-      return FALSE;
+      no_match = FALSE;
+      break;
     }
   }
-  *ssl_sessionid = NULL;
 
-  /* Unlock for reading */
-  if(data->share && data->share->sslsession == data->state.session)
+  /* Unlock */
+  if(data->share &&
+     (data->share->specifier & (1<<CURL_LOCK_DATA_SSL_SESSION)) )
     Curl_share_unlock(data, CURL_LOCK_DATA_SSL_SESSION);
 
-
-  return TRUE;
+  return no_match;
 }
 
 /*