getsessionid: don't ever return while locked

Also, check for the session sharing bit instead of comparing pointers
This commit is contained in:
Daniel Stenberg 2011-11-17 23:55:36 +01:00
parent bb4eb58996
commit 10ecdf5078

View File

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