| Index: base/openssl_util.cc
|
| ===================================================================
|
| --- base/openssl_util.cc (revision 80572)
|
| +++ base/openssl_util.cc (working copy)
|
| @@ -1,113 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "base/openssl_util.h"
|
| -
|
| -#include <openssl/err.h>
|
| -#include <openssl/ssl.h>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/memory/scoped_vector.h"
|
| -#include "base/memory/singleton.h"
|
| -#include "base/string_piece.h"
|
| -#include "base/synchronization/lock.h"
|
| -
|
| -namespace base {
|
| -
|
| -namespace {
|
| -
|
| -unsigned long CurrentThreadId() {
|
| - return static_cast<unsigned long>(PlatformThread::CurrentId());
|
| -}
|
| -
|
| -// Singleton for initializing and cleaning up the OpenSSL library.
|
| -class OpenSSLInitSingleton {
|
| - public:
|
| - static OpenSSLInitSingleton* GetInstance() {
|
| - // We allow the SSL environment to leak for multiple reasons:
|
| - // - it is used from a non-joinable worker thread that is not stopped on
|
| - // shutdown, hence may still be using OpenSSL library after the AtExit
|
| - // runner has completed.
|
| - // - There are other OpenSSL related singletons (e.g. the client socket
|
| - // context) who's cleanup depends on the global environment here, but
|
| - // we can't control the order the AtExit handlers will run in so
|
| - // allowing the global environment to leak at least ensures it is
|
| - // available for those other singletons to reliably cleanup.
|
| - return Singleton<OpenSSLInitSingleton,
|
| - LeakySingletonTraits<OpenSSLInitSingleton> >::get();
|
| - }
|
| - private:
|
| - friend struct DefaultSingletonTraits<OpenSSLInitSingleton>;
|
| - OpenSSLInitSingleton() {
|
| - SSL_load_error_strings();
|
| - SSL_library_init();
|
| - OpenSSL_add_all_algorithms();
|
| - int num_locks = CRYPTO_num_locks();
|
| - locks_.reserve(num_locks);
|
| - for (int i = 0; i < num_locks; ++i)
|
| - locks_.push_back(new base::Lock());
|
| - CRYPTO_set_locking_callback(LockingCallback);
|
| - CRYPTO_set_id_callback(CurrentThreadId);
|
| - }
|
| -
|
| - ~OpenSSLInitSingleton() {
|
| - CRYPTO_set_locking_callback(NULL);
|
| - EVP_cleanup();
|
| - ERR_free_strings();
|
| - }
|
| -
|
| - static void LockingCallback(int mode, int n, const char* file, int line) {
|
| - OpenSSLInitSingleton::GetInstance()->OnLockingCallback(mode, n, file, line);
|
| - }
|
| -
|
| - void OnLockingCallback(int mode, int n, const char* file, int line) {
|
| - CHECK_LT(static_cast<size_t>(n), locks_.size());
|
| - if (mode & CRYPTO_LOCK)
|
| - locks_[n]->Acquire();
|
| - else
|
| - locks_[n]->Release();
|
| - }
|
| -
|
| - // These locks are used and managed by OpenSSL via LockingCallback().
|
| - ScopedVector<base::Lock> locks_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(OpenSSLInitSingleton);
|
| -};
|
| -
|
| -// Callback routine for OpenSSL to print error messages. |str| is a
|
| -// NULL-terminated string of length |len| containing diagnostic information
|
| -// such as the library, function and reason for the error, the file and line
|
| -// where the error originated, plus potentially any context-specific
|
| -// information about the error. |context| contains a pointer to user-supplied
|
| -// data, which is currently unused.
|
| -// If this callback returns a value <= 0, OpenSSL will stop processing the
|
| -// error queue and return, otherwise it will continue calling this function
|
| -// until all errors have been removed from the queue.
|
| -int OpenSSLErrorCallback(const char* str, size_t len, void* context) {
|
| - DVLOG(1) << "\t" << StringPiece(str, len);
|
| - return 1;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -void EnsureOpenSSLInit() {
|
| - (void)OpenSSLInitSingleton::GetInstance();
|
| -}
|
| -
|
| -void ClearOpenSSLERRStack(const tracked_objects::Location& location) {
|
| - if (logging::DEBUG_MODE && VLOG_IS_ON(1)) {
|
| - int error_num = ERR_peek_error();
|
| - if (error_num == 0)
|
| - return;
|
| -
|
| - std::string message;
|
| - location.Write(true, true, &message);
|
| - DVLOG(1) << "OpenSSL ERR_get_error stack from " << message;
|
| - ERR_print_errors_cb(&OpenSSLErrorCallback, NULL);
|
| - } else {
|
| - ERR_clear_error();
|
| - }
|
| -}
|
| -
|
| -} // namespace base
|
|
|