Fix a runtime crash in some SSL codepaths. Will be in next release after 8.12.0. https://github.com/curl/curl/issues/16236#issuecomment-2645385845 --- lib/setopt.c.orig +++ lib/setopt.c @@ -1584,10 +1584,6 @@ static CURLcode setopt_pointers(struct Curl_easy *data, CURLoption option, if(data->share->hsts == data->hsts) data->hsts = NULL; #endif -#ifdef USE_SSL - if(data->share->ssl_scache == data->state.ssl_scache) - data->state.ssl_scache = data->multi ? data->multi->ssl_scache : NULL; -#endif #ifdef USE_LIBPSL if(data->psl == &data->share->psl) data->psl = data->multi ? &data->multi->psl : NULL; @@ -1628,10 +1624,6 @@ static CURLcode setopt_pointers(struct Curl_easy *data, CURLoption option, data->hsts = data->share->hsts; } #endif -#ifdef USE_SSL - if(data->share->ssl_scache) - data->state.ssl_scache = data->share->ssl_scache; -#endif #ifdef USE_LIBPSL if(data->share->specifier & (1 << CURL_LOCK_DATA_PSL)) data->psl = &data->share->psl; --- lib/transfer.c.orig +++ lib/transfer.c @@ -567,12 +567,6 @@ CURLcode Curl_pretransfer(struct Curl_easy *data) #endif data->state.httpreq = data->set.method; -#ifdef USE_SSL - if(!data->state.ssl_scache) - /* There was no ssl session cache set via a share, use the multi one */ - data->state.ssl_scache = data->multi->ssl_scache; -#endif - data->state.requests = 0; data->state.followlocation = 0; /* reset the location-follow counter */ data->state.this_is_a_follow = FALSE; /* reset this */ --- lib/urldata.h.orig +++ lib/urldata.h @@ -1199,7 +1199,6 @@ struct UrlState { curl_prot_t first_remote_protocol; int retrycount; /* number of retries on a new connection */ - struct Curl_ssl_scache *ssl_scache; /* TLS session pool */ int os_errno; /* filled in with errno whenever an error occurs */ long followlocation; /* redirect counter */ int requests; /* request counter: redirects + authentication retakes */ --- lib/vtls/vtls_scache.c.orig +++ lib/vtls/vtls_scache.c @@ -82,6 +82,17 @@ struct Curl_ssl_scache { long age; }; +static struct Curl_ssl_scache *cf_ssl_scache_get(struct Curl_easy *data) +{ + struct Curl_ssl_scache *scache = NULL; + /* If a share is present, its ssl_scache has preference over the multi */ + if(data->share && data->share->ssl_scache) + scache = data->share->ssl_scache; + else if(data->multi && data->multi->ssl_scache) + scache = data->multi->ssl_scache; + return scache; +} + static void cf_ssl_scache_clear_session(struct Curl_ssl_session *s) { if(s->sdata) { @@ -792,7 +803,7 @@ CURLcode Curl_ssl_scache_put(struct Curl_cfilter *cf, const char *ssl_peer_key, struct Curl_ssl_session *s) { - struct Curl_ssl_scache *scache = data->state.ssl_scache; + struct Curl_ssl_scache *scache = cf_ssl_scache_get(data); struct ssl_config_data *ssl_config = Curl_ssl_cf_get_config(cf, data); CURLcode result; DEBUGASSERT(ssl_config); @@ -826,7 +837,7 @@ CURLcode Curl_ssl_scache_take(struct Curl_cfilter *cf, const char *ssl_peer_key, struct Curl_ssl_session **ps) { - struct Curl_ssl_scache *scache = data->state.ssl_scache; + struct Curl_ssl_scache *scache = cf_ssl_scache_get(data); struct ssl_primary_config *conn_config = Curl_ssl_cf_get_primary_config(cf); struct Curl_ssl_scache_peer *peer = NULL; struct Curl_llist_node *n; @@ -870,7 +881,7 @@ CURLcode Curl_ssl_scache_add_obj(struct Curl_cfilter *cf, void *sobj, Curl_ssl_scache_obj_dtor *sobj_free) { - struct Curl_ssl_scache *scache = data->state.ssl_scache; + struct Curl_ssl_scache *scache = cf_ssl_scache_get(data); struct ssl_primary_config *conn_config = Curl_ssl_cf_get_primary_config(cf); struct Curl_ssl_scache_peer *peer = NULL; CURLcode result; @@ -898,7 +909,7 @@ bool Curl_ssl_scache_get_obj(struct Curl_cfilter *cf, const char *ssl_peer_key, void **sobj) { - struct Curl_ssl_scache *scache = data->state.ssl_scache; + struct Curl_ssl_scache *scache = cf_ssl_scache_get(data); struct ssl_primary_config *conn_config = Curl_ssl_cf_get_primary_config(cf); struct Curl_ssl_scache_peer *peer = NULL; CURLcode result; @@ -924,7 +935,7 @@ void Curl_ssl_scache_remove_all(struct Curl_cfilter *cf, struct Curl_easy *data, const char *ssl_peer_key) { - struct Curl_ssl_scache *scache = data->state.ssl_scache; + struct Curl_ssl_scache *scache = cf_ssl_scache_get(data); struct ssl_primary_config *conn_config = Curl_ssl_cf_get_primary_config(cf); struct Curl_ssl_scache_peer *peer = NULL; CURLcode result; @@ -1021,7 +1032,7 @@ CURLcode Curl_ssl_session_import(struct Curl_easy *data, const unsigned char *shmac, size_t shmac_len, const unsigned char *sdata, size_t sdata_len) { - struct Curl_ssl_scache *scache = data->state.ssl_scache; + 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; @@ -1092,7 +1103,7 @@ CURLcode Curl_ssl_session_export(struct Curl_easy *data, curl_ssls_export_cb *export_fn, void *userptr) { - struct Curl_ssl_scache *scache = data->state.ssl_scache; + struct Curl_ssl_scache *scache = cf_ssl_scache_get(data); struct Curl_ssl_scache_peer *peer; struct dynbuf sbuf, hbuf; struct Curl_llist_node *n;