Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(123)

Unified Diff: net/socket/ssl_session_cache_openssl.cc

Issue 353713005: Implements new, more robust design for communicating between SSLConnectJobs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed comment I missed in the last patch. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/socket/ssl_session_cache_openssl.cc
diff --git a/net/socket/ssl_session_cache_openssl.cc b/net/socket/ssl_session_cache_openssl.cc
index d16bb8d6325ec6b105da7219d4e9ea9e5f6f4828..dca1c48a8d4c8b0b8c4165c1967f4a06208c9f33 100644
--- a/net/socket/ssl_session_cache_openssl.cc
+++ b/net/socket/ssl_session_cache_openssl.cc
@@ -10,6 +10,7 @@
#include <openssl/rand.h>
#include <openssl/ssl.h>
+#include "base/callback.h"
#include "base/containers/hash_tables.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
@@ -236,14 +237,58 @@ class SSLSessionCacheOpenSSLImpl {
return SSL_set_session(ssl, session) == 1;
}
+ bool SSLSessionIsInCache(const std::string& cache_key) const {
+ base::AutoLock locked(lock_);
+ KeyIndex::const_iterator it = key_index_.find(cache_key);
+ if (it == key_index_.end())
+ return false;
+
+ SSL_SESSION* session = *it->second;
+ DCHECK(session);
+
+ void* session_is_good =
+ SSL_SESSION_get_ex_data(session, GetSSLSessionExIndex());
+
+ return session_is_good;
+ }
+
+ void SetSessionAddedCallback(SSL* ssl, const base::Closure& callback) {
+ // Add this SSL* to the SSLtoCallbackMap.
+ ssl_to_callback_map_.insert(SSLToCallbackMap::value_type(
+ ssl, CallbackAndCompletionCount(callback, 0)));
+ }
+
+ // Determines if the session for |ssl| is in the cache, and calls the
+ // appropriate callback if that is the case.
+ void CheckIfSessionFinished(SSL* ssl) {
+ SSLToCallbackMap::iterator it = ssl_to_callback_map_.find(ssl);
+ if (it == ssl_to_callback_map_.end())
+ return;
+ // Increment the session's completion count.
+ if (++it->second.count == 2) {
+ // The session has been MarkedAsGood and Added, so it can be used.
+ // These two events can occur in either order.
+ base::Closure callback = it->second.callback;
+ ssl_to_callback_map_.erase(it);
+ callback.Run();
+ }
+ }
+
+ void RemoveSessionAddedCallback(SSL* ssl) { ssl_to_callback_map_.erase(ssl); }
+
void MarkSSLSessionAsGood(SSL* ssl) {
SSL_SESSION* session = SSL_get_session(ssl);
- if (!session)
+
+ if (!session) {
+ CHECK(session);
return;
+ }
wtc 2014/07/23 22:53:33 Please replace lines 282-285 with CHECK(session)
mshelley 2014/07/24 20:37:49 Done.
// Mark the session as good, allowing it to be used for future connections.
SSL_SESSION_set_ex_data(
session, GetSSLSessionExIndex(), reinterpret_cast<void*>(1));
+
+ CheckIfSessionFinished(ssl);
}
// Flush all entries from the cache.
@@ -259,12 +304,30 @@ class SSLSessionCacheOpenSSLImpl {
}
private:
+ // CallbackAndCompletionCounts are used to group a callback that should be
+ // run when a certian sesssion is added to the session cache with an integer
+ // indicating the status of that session.
+ struct CallbackAndCompletionCount {
+ CallbackAndCompletionCount(const base::Closure& completion_callback,
+ int completion_count)
+ : callback(completion_callback), count(completion_count) {}
+
+ const base::Closure callback;
+ // |count| < 2 means that the ssl session associated with this object
+ // has not been added to the session cache or has not been marked as good.
+ // |count| is incremented when a session is added to the cache or marked as
+ // good, thus |count| == 2 means that the session is ready for use.
+ int count;
+ };
+
// Type for list of SSL_SESSION handles, ordered in MRU order.
typedef std::list<SSL_SESSION*> MRUSessionList;
// Type for a dictionary from unique cache keys to session list nodes.
typedef base::hash_map<std::string, MRUSessionList::iterator> KeyIndex;
// Type for a dictionary from SessionId values to key index nodes.
typedef base::hash_map<SessionId, KeyIndex::iterator> SessionIdIndex;
+ // Type for a map from SSL* to associated callbacks
+ typedef std::map<SSL*, CallbackAndCompletionCount> SSLToCallbackMap;
// Return the key associated with a given session, or the empty string if
// none exist. This shall only be used for debugging.
@@ -342,7 +405,9 @@ class SSLSessionCacheOpenSSLImpl {
// to indicate that it took ownership of the session, i.e. that the caller
// should not decrement its reference count after completion.
static int NewSessionCallbackStatic(SSL* ssl, SSL_SESSION* session) {
- GetCache(ssl->ctx)->OnSessionAdded(ssl, session);
+ SSLSessionCacheOpenSSLImpl* cache = GetCache(ssl->ctx);
+ cache->OnSessionAdded(ssl, session);
+ cache->CheckIfSessionFinished(ssl);
return 1;
}
@@ -466,10 +531,11 @@ class SSLSessionCacheOpenSSLImpl {
SSL_CTX* ctx_;
SSLSessionCacheOpenSSL::Config config_;
+ SSLToCallbackMap ssl_to_callback_map_;
// method to get the index which can later be used with SSL_CTX_get_ex_data()
// or SSL_CTX_set_ex_data().
- base::Lock lock_; // Protects access to containers below.
+ mutable base::Lock lock_; // Protects access to containers below.
MRUSessionList ordering_;
KeyIndex key_index_;
@@ -499,6 +565,20 @@ bool SSLSessionCacheOpenSSL::SetSSLSessionWithKey(
return impl_->SetSSLSessionWithKey(ssl, cache_key);
}
+bool SSLSessionCacheOpenSSL::SSLSessionIsInCache(
+ const std::string& cache_key) const {
+ return impl_->SSLSessionIsInCache(cache_key);
+}
+
+void SSLSessionCacheOpenSSL::RemoveSessionAddedCallback(SSL* ssl) {
+ impl_->RemoveSessionAddedCallback(ssl);
+}
+
+void SSLSessionCacheOpenSSL::SetSessionAddedCallback(SSL* ssl,
+ const base::Closure& cb) {
+ impl_->SetSessionAddedCallback(ssl, cb);
+}
+
void SSLSessionCacheOpenSSL::MarkSSLSessionAsGood(SSL* ssl) {
return impl_->MarkSSLSessionAsGood(ssl);
}
« net/socket/ssl_client_socket_pool_unittest.cc ('K') | « net/socket/ssl_session_cache_openssl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698