Index: chrome/browser/net/nss_context_linux.cc |
diff --git a/chrome/browser/net/nss_context_linux.cc b/chrome/browser/net/nss_context_linux.cc |
index 5aa18e6bb64f8196a01154eef396c0c84d7fe332..9021a908423124c46d55ebdc8620811468abf9a1 100644 |
--- a/chrome/browser/net/nss_context_linux.cc |
+++ b/chrome/browser/net/nss_context_linux.cc |
@@ -8,6 +8,10 @@ |
#include "crypto/nss_util_internal.h" |
#include "net/cert/nss_cert_database.h" |
+namespace { |
+net::NSSCertDatabase* g_nss_cert_database = NULL; |
Ryan Sleevi
2014/07/24 23:19:10
You'll probably get LSAN yelling at you. it has a
|
+} // namespace |
+ |
crypto::ScopedPK11Slot GetPublicNSSKeySlotForResourceContext( |
content::ResourceContext* context) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
@@ -24,6 +28,18 @@ crypto::ScopedPK11Slot GetPrivateNSSKeySlotForResourceContext( |
net::NSSCertDatabase* GetNSSCertDatabaseForResourceContext( |
content::ResourceContext* context, |
const base::Callback<void(net::NSSCertDatabase*)>& callback) { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
- return net::NSSCertDatabase::GetInstance(); |
+ // This initialization is not thread safe. This CHECK ensures that this code |
+ // is only run on a single thread. |
+ CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
+ if (!g_nss_cert_database) { |
+ // Linux has only a single persistent slot compared to ChromeOS's separate |
+ // public and private slot. |
+ // Redirect any slot usage to this persistent slot on Linux. |
+ g_nss_cert_database = new net::NSSCertDatabase( |
+ crypto::ScopedPK11Slot( |
+ crypto::GetPersistentNSSKeySlot()) /* public slot */, |
+ crypto::ScopedPK11Slot( |
+ crypto::GetPersistentNSSKeySlot()) /* private slot */); |
+ } |
+ return g_nss_cert_database; |
} |