diff options
author | zork@chromium.org <zork@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-08 04:58:45 +0000 |
---|---|---|
committer | zork@chromium.org <zork@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-08 04:58:45 +0000 |
commit | 25b625367932074111402ebe1dcc7bb54e3a54f4 (patch) | |
tree | d243fc266217bd01862fadef89972fa5dc1039b8 /net/base/cert_verifier.cc | |
parent | 4df400db387b816286d2a6b1519b9d4720e83393 (diff) | |
download | chromium_src-25b625367932074111402ebe1dcc7bb54e3a54f4.zip chromium_src-25b625367932074111402ebe1dcc7bb54e3a54f4.tar.gz chromium_src-25b625367932074111402ebe1dcc7bb54e3a54f4.tar.bz2 |
Update CertVerifier to watch for the origin loop's destruction, so that
it doesn't crash if the SSLClientSocket is leaked.
BUG=chromium-os:8179
TEST=None
Review URL: http://codereview.chromium.org/4299001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@65349 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/cert_verifier.cc')
-rw-r--r-- | net/base/cert_verifier.cc | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/net/base/cert_verifier.cc b/net/base/cert_verifier.cc index 4e94133..103c6c3 100644 --- a/net/base/cert_verifier.cc +++ b/net/base/cert_verifier.cc @@ -17,7 +17,8 @@ namespace net { class CertVerifier::Request : - public base::RefCountedThreadSafe<CertVerifier::Request> { + public base::RefCountedThreadSafe<CertVerifier::Request>, + public MessageLoop::DestructionObserver { public: Request(CertVerifier* verifier, X509Certificate* cert, @@ -33,6 +34,8 @@ class CertVerifier::Request : callback_(callback), origin_loop_(MessageLoop::current()), error_(OK) { + if (origin_loop_) + origin_loop_->AddDestructionObserver(this); } void DoVerify() { @@ -86,13 +89,25 @@ class CertVerifier::Request : verifier_ = NULL; AutoLock locked(origin_loop_lock_); + if (origin_loop_) { + origin_loop_->RemoveDestructionObserver(this); + origin_loop_ = NULL; + } + } + + // MessageLoop::DestructionObserver override. + virtual void WillDestroyCurrentMessageLoop() { + LOG(ERROR) << "CertVerifier wasn't deleted before the thread was deleted."; + AutoLock locked(origin_loop_lock_); origin_loop_ = NULL; } private: friend class base::RefCountedThreadSafe<CertVerifier::Request>; - ~Request() {} + ~Request() { + Cancel(); + } // Set on the origin thread, read on the worker thread. scoped_refptr<X509Certificate> cert_; |