struct Curl_easy *data = curl;
if(!GOOD_EASY_HANDLE(data))
return CURLE_BAD_FUNCTION_ARGUMENT;
+ if(Curl_is_in_callback(data) || Curl_ssl_scache_is_locked(data))
+ return CURLE_RECURSIVE_API_CALL;
return Curl_ssl_session_import(data, session_key,
shmac, shmac_len, sdata, sdata_len);
#else
struct Curl_easy *data = curl;
if(!GOOD_EASY_HANDLE(data))
return CURLE_BAD_FUNCTION_ARGUMENT;
+ if(Curl_is_in_callback(data) || Curl_ssl_scache_is_locked(data))
+ return CURLE_RECURSIVE_API_CALL;
return Curl_ssl_session_export(data, export_fn, userptr);
#else
(void)curl;
size_t peer_count;
int default_lifetime_secs;
long age;
+ BIT(is_locked);
};
static struct Curl_ssl_scache *cf_ssl_scache_get(struct Curl_easy *data)
/* Lock shared SSL session data */
void Curl_ssl_scache_lock(struct Curl_easy *data)
{
- if(CURL_SHARE_ssl_scache(data))
- Curl_share_lock(data, CURL_LOCK_DATA_SSL_SESSION, CURL_LOCK_ACCESS_SINGLE);
+ struct Curl_ssl_scache *scache = cf_ssl_scache_get(data);
+ if(scache) {
+ if(CURL_SHARE_ssl_scache(data))
+ Curl_share_lock(data, CURL_LOCK_DATA_SSL_SESSION,
+ CURL_LOCK_ACCESS_SINGLE);
+ DEBUGASSERT(!scache->is_locked);
+ scache->is_locked = TRUE;
+ }
}
/* Unlock shared SSL session data */
void Curl_ssl_scache_unlock(struct Curl_easy *data)
{
- if(CURL_SHARE_ssl_scache(data))
- Curl_share_unlock(data, CURL_LOCK_DATA_SSL_SESSION);
+ struct Curl_ssl_scache *scache = cf_ssl_scache_get(data);
+ if(scache) {
+ DEBUGASSERT(scache->is_locked);
+ scache->is_locked = FALSE;
+ if(CURL_SHARE_ssl_scache(data))
+ Curl_share_unlock(data, CURL_LOCK_DATA_SSL_SESSION);
+ }
}
static bool cf_ssl_scache_match_auth(struct Curl_ssl_scache_peer *peer,
#define CURL_SSL_TICKET_MAX (16 * 1024)
+bool Curl_ssl_scache_is_locked(struct Curl_easy *data)
+{
+ struct Curl_ssl_scache *scache = cf_ssl_scache_get(data);
+ return scache && scache->is_locked;
+}
+
static CURLcode cf_ssl_scache_peer_set_hmac(struct Curl_ssl_scache_peer *peer)
{
CURLcode result;
struct Curl_ssl_scache *scache = cf_ssl_scache_get(data);
struct Curl_ssl_scache_peer *peer = NULL;
struct Curl_ssl_session *s = NULL;
- bool locked = FALSE;
CURLcode result;
if(!scache) {
goto out;
Curl_ssl_scache_lock(data);
- locked = TRUE;
if(ssl_peer_key) {
result = cf_ssl_add_peer(data, scache, ssl_peer_key, NULL, &peer);
}
out:
- if(locked)
+ if(scache && scache->is_locked)
Curl_ssl_scache_unlock(data);
Curl_ssl_session_destroy(s);
return result;
if(!export_fn)
return CURLE_BAD_FUNCTION_ARGUMENT;
- if(!scache)
- return CURLE_OK;
Curl_ssl_scache_lock(data);