summaryrefslogtreecommitdiffstats
path: root/net/base/cert_verifier.cc
diff options
context:
space:
mode:
authorzork@chromium.org <zork@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-08 04:58:45 +0000
committerzork@chromium.org <zork@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-08 04:58:45 +0000
commit25b625367932074111402ebe1dcc7bb54e3a54f4 (patch)
treed243fc266217bd01862fadef89972fa5dc1039b8 /net/base/cert_verifier.cc
parent4df400db387b816286d2a6b1519b9d4720e83393 (diff)
downloadchromium_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.cc19
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_;