- if (try_session_cache &&
- ret == NULL &&
- !(s->session_ctx->session_cache_mode &
- SSL_SESS_CACHE_NO_INTERNAL_LOOKUP)) {
- SSL_SESSION data;
-
- data.ssl_version = s->version;
- memcpy(data.session_id, hello->session_id, hello->session_id_len);
- data.session_id_length = hello->session_id_len;
-
- CRYPTO_THREAD_read_lock(s->session_ctx->lock);
- ret = lh_SSL_SESSION_retrieve(s->session_ctx->sessions, &data);
- if (ret != NULL) {
- /* don't allow other threads to steal it: */
- SSL_SESSION_up_ref(ret);
- }
- CRYPTO_THREAD_unlock(s->session_ctx->lock);
- if (ret == NULL)
- CRYPTO_atomic_add(&s->session_ctx->stats.sess_miss, 1, &discard,
- s->session_ctx->lock);
- }
-
- if (try_session_cache &&
- ret == NULL && s->session_ctx->get_session_cb != NULL) {
- int copy = 1;
-
- ret = s->session_ctx->get_session_cb(s, hello->session_id,
- hello->session_id_len,
- ©);
-
- if (ret != NULL) {
- CRYPTO_atomic_add(&s->session_ctx->stats.sess_cb_hit, 1, &discard,
- s->session_ctx->lock);
-
- /*
- * Increment reference count now if the session callback asks us
- * to do so (note that if the session structures returned by the
- * callback are shared between threads, it must handle the
- * reference count itself [i.e. copy == 0], or things won't be
- * thread-safe).
- */
- if (copy)
- SSL_SESSION_up_ref(ret);
-
- /*
- * Add the externally cached session to the internal cache as
- * well if and only if we are supposed to.
- */
- if (!
- (s->session_ctx->session_cache_mode &
- SSL_SESS_CACHE_NO_INTERNAL_STORE)) {
- /*
- * Either return value of SSL_CTX_add_session should not
- * interrupt the session resumption process. The return
- * value is intentionally ignored.
- */
- SSL_CTX_add_session(s->session_ctx, ret);
- }
- }
- }
-