Index: net/base/cert_verifier.cc |
=================================================================== |
--- net/base/cert_verifier.cc (revision 72195) |
+++ net/base/cert_verifier.cc (working copy) |
@@ -109,6 +109,8 @@ |
delete this; |
} |
+ bool canceled() const { return !callback_; } |
+ |
private: |
CompletionCallback* callback_; |
CertVerifyResult* verify_result_; |
@@ -236,8 +238,10 @@ |
} |
~CertVerifierJob() { |
- if (worker_) |
+ if (worker_) { |
worker_->Cancel(); |
+ DeleteAllCanceled(); |
+ } |
} |
void AddRequest(CertVerifierRequest* request) { |
@@ -261,6 +265,17 @@ |
} |
} |
+ void DeleteAllCanceled() { |
+ for (std::vector<CertVerifierRequest*>::iterator |
+ i = requests_.begin(); i != requests_.end(); i++) { |
+ if ((*i)->canceled()) { |
+ delete *i; |
+ } else { |
+ LOG(DFATAL) << "CertVerifierRequest leaked!"; |
+ } |
+ } |
+ } |
+ |
std::vector<CertVerifierRequest*> requests_; |
CertVerifierWorker* worker_; |
}; |
@@ -328,14 +343,15 @@ |
CertVerifierWorker* worker = new CertVerifierWorker(cert, hostname, flags, |
this); |
job = new CertVerifierJob(worker); |
- inflight_.insert(std::make_pair(key, job)); |
if (!worker->Start()) { |
- inflight_.erase(key); |
delete job; |
delete worker; |
*out_req = NULL; |
- return ERR_FAILED; // TODO(wtc): Log an error message. |
+ // TODO(wtc): log to the NetLog. |
+ LOG(ERROR) << "CertVerifierWorker couldn't be started."; |
+ return ERR_INSUFFICIENT_RESOURCES; // Just a guess. |
} |
+ inflight_.insert(std::make_pair(key, job)); |
} |
CertVerifierRequest* request = |