Index: net/base/ssl_client_socket_win.cc |
=================================================================== |
--- net/base/ssl_client_socket_win.cc (revision 18844) |
+++ net/base/ssl_client_socket_win.cc (working copy) |
@@ -8,6 +8,7 @@ |
#include "base/lock.h" |
#include "base/singleton.h" |
+#include "base/stl_util-inl.h" |
#include "base/string_util.h" |
#include "net/base/connection_type_histograms.h" |
#include "net/base/io_buffer.h" |
@@ -80,8 +81,7 @@ |
}; |
// CredHandleClass simply gives a default constructor and a destructor to |
-// SSPI's CredHandle type (a C struct). The default constuctor is required |
-// by STL containers. |
+// SSPI's CredHandle type (a C struct). |
class CredHandleClass : public CredHandle { |
public: |
CredHandleClass() { |
@@ -102,16 +102,25 @@ |
public: |
CredHandleTable() {} |
- ~CredHandleTable() {} |
+ ~CredHandleTable() { |
+ STLDeleteContainerPairSecondPointers(client_cert_creds_.begin(), |
+ client_cert_creds_.end()); |
+ } |
CredHandle* GetHandle(PCCERT_CONTEXT client_cert, int ssl_version_mask) { |
DCHECK(0 < ssl_version_mask && |
ssl_version_mask < arraysize(anonymous_creds_)); |
- CredHandle* handle; |
+ CredHandleClass* handle; |
AutoLock lock(lock_); |
if (client_cert) { |
- handle = &client_cert_creds_[ |
- std::make_pair(client_cert, ssl_version_mask)]; |
+ CredHandleMapKey key = std::make_pair(client_cert, ssl_version_mask); |
+ CredHandleMap::const_iterator it = client_cert_creds_.find(key); |
+ if (it == client_cert_creds_.end()) { |
+ handle = new CredHandleClass; |
+ client_cert_creds_[key] = handle; |
+ } else { |
+ handle = it->second; |
+ } |
} else { |
handle = &anonymous_creds_[ssl_version_mask]; |
} |
@@ -126,7 +135,7 @@ |
// int ssl_version_mask |
typedef std::pair<PCCERT_CONTEXT, int> CredHandleMapKey; |
- typedef std::map<CredHandleMapKey, CredHandleClass> CredHandleMap; |
+ typedef std::map<CredHandleMapKey, CredHandleClass*> CredHandleMap; |
static void InitializeHandle(CredHandle* handle, |
PCCERT_CONTEXT client_cert, |