diff options
author | rsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-23 05:45:54 +0000 |
---|---|---|
committer | rsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-23 05:45:54 +0000 |
commit | f4ffb73c48cb7bb329ccd06e6de041296494910f (patch) | |
tree | ac8810b39c81cb8b59a00625a28c160dfb8fd3dc /net | |
parent | c5b9a81a2ffc3b4ffc59ad7bee966e65fbcaba29 (diff) | |
download | chromium_src-f4ffb73c48cb7bb329ccd06e6de041296494910f.zip chromium_src-f4ffb73c48cb7bb329ccd06e6de041296494910f.tar.gz chromium_src-f4ffb73c48cb7bb329ccd06e6de041296494910f.tar.bz2 |
Revert 97821 - Do not call callback->Run() until we are about to return from this
object because callback->Run() may cause this object to be deleted.
Previously we were calling callback->Run() in DoWaitForDataReadyDone(),
which returns to the do-while loop in DoLoop(). The do-while loop
reads the state_ member. If the object was deleted in callback->Run(),
we would be reading state_ after free.
Miscellaneous cleanups: omit net::, and use the assign() method of
std::string to avoid constructing a temporary object.
R=agl@chromium.org,rvargas@chromium.org
BUG=84426
TEST=net_unittests --gtest_filter=DiskCacheBasedSSLHostInfo.DeleteInCallback
Review URL: http://codereview.chromium.org/7648007
TBR=wtc@chromium.org
Review URL: http://codereview.chromium.org/7709022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@97822 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r-- | net/http/disk_cache_based_ssl_host_info.cc | 26 | ||||
-rw-r--r-- | net/http/disk_cache_based_ssl_host_info.h | 8 | ||||
-rw-r--r-- | net/http/http_cache_unittest.cc | 42 |
3 files changed, 15 insertions, 61 deletions
diff --git a/net/http/disk_cache_based_ssl_host_info.cc b/net/http/disk_cache_based_ssl_host_info.cc index 55f471d5..2b509ca 100644 --- a/net/http/disk_cache_based_ssl_host_info.cc +++ b/net/http/disk_cache_based_ssl_host_info.cc @@ -41,7 +41,7 @@ DiskCacheBasedSSLHostInfo::DiskCacheBasedSSLHostInfo( : SSLHostInfo(hostname, ssl_config, cert_verifier), weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), callback_(new CallbackImpl(weak_ptr_factory_.GetWeakPtr(), - &DiskCacheBasedSSLHostInfo::OnIOComplete)), + &DiskCacheBasedSSLHostInfo::DoLoop)), state_(GET_BACKEND), ready_(false), hostname_(hostname), @@ -98,17 +98,7 @@ std::string DiskCacheBasedSSLHostInfo::key() const { return "sslhostinfo:" + hostname_; } -void DiskCacheBasedSSLHostInfo::OnIOComplete(int rv) { - rv = DoLoop(rv); - if (rv != ERR_IO_PENDING) { - CompletionCallback* callback = user_callback_; - user_callback_ = NULL; - if (callback) - callback->Run(rv); - } -} - -int DiskCacheBasedSSLHostInfo::DoLoop(int rv) { +void DiskCacheBasedSSLHostInfo::DoLoop(int rv) { do { switch (state_) { case GET_BACKEND: @@ -152,8 +142,6 @@ int DiskCacheBasedSSLHostInfo::DoLoop(int rv) { NOTREACHED(); } } while (rv != ERR_IO_PENDING && state_ != NONE); - - return rv; } int DiskCacheBasedSSLHostInfo::DoGetBackendComplete(int rv) { @@ -179,7 +167,7 @@ int DiskCacheBasedSSLHostInfo::DoOpenComplete(int rv) { int DiskCacheBasedSSLHostInfo::DoReadComplete(int rv) { if (rv > 0) - data_.assign(read_buffer_->data(), rv); + data_ = std::string(read_buffer_->data(), rv); state_ = WAIT_FOR_DATA_READY_DONE; return OK; @@ -239,15 +227,23 @@ int DiskCacheBasedSSLHostInfo::DoCreate() { } int DiskCacheBasedSSLHostInfo::DoWaitForDataReadyDone() { + CompletionCallback* callback; + DCHECK(!ready_); state_ = NONE; ready_ = true; + callback = user_callback_; + user_callback_ = NULL; // We close the entry because, if we shutdown before ::Persist is called, // then we might leak a cache reference, which causes a DCHECK on shutdown. if (entry_) entry_->Close(); entry_ = NULL; Parse(data_); + + if (callback) + callback->Run(OK); + return OK; } diff --git a/net/http/disk_cache_based_ssl_host_info.h b/net/http/disk_cache_based_ssl_host_info.h index 873e4bd..c28d403 100644 --- a/net/http/disk_cache_based_ssl_host_info.h +++ b/net/http/disk_cache_based_ssl_host_info.h @@ -79,9 +79,7 @@ class DiskCacheBasedSSLHostInfo : public SSLHostInfo, std::string key() const; - void OnIOComplete(int rv); - - int DoLoop(int rv); + void DoLoop(int rv); int DoGetBackendComplete(int rv); int DoOpenComplete(int rv); @@ -114,8 +112,8 @@ class DiskCacheBasedSSLHostInfo : public SSLHostInfo, disk_cache::Backend* backend_; disk_cache::Entry* entry_; CompletionCallback* user_callback_; - scoped_refptr<IOBuffer> read_buffer_; - scoped_refptr<IOBuffer> write_buffer_; + scoped_refptr<net::IOBuffer> read_buffer_; + scoped_refptr<net::IOBuffer> write_buffer_; std::string data_; }; diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc index 6ea1be2..dceabf8 100644 --- a/net/http/http_cache_unittest.cc +++ b/net/http/http_cache_unittest.cc @@ -16,9 +16,7 @@ #include "net/base/net_errors.h" #include "net/base/net_log_unittest.h" #include "net/base/ssl_cert_request_info.h" -#include "net/base/ssl_config_service.h" #include "net/disk_cache/disk_cache.h" -#include "net/http/disk_cache_based_ssl_host_info.h" #include "net/http/http_byte_range.h" #include "net/http/http_request_headers.h" #include "net/http/http_request_info.h" @@ -1040,7 +1038,7 @@ struct Context { //----------------------------------------------------------------------------- -// HttpCache tests +// tests TEST(HttpCache, CreateThenDestroy) { MockHttpCache cache; @@ -5182,41 +5180,3 @@ TEST(HttpCache, TruncatedByContentLength2) { EXPECT_TRUE(truncated); entry->Close(); } - -//----------------------------------------------------------------------------- -// DiskCacheBasedSSLHostInfo tests - -class DeleteSSLHostInfoCompletionCallback : public TestCompletionCallback { - public: - explicit DeleteSSLHostInfoCompletionCallback(net::SSLHostInfo* ssl_host_info) - : ssl_host_info_(ssl_host_info) {} - - virtual void RunWithParams(const Tuple1<int>& params) { - delete ssl_host_info_; - TestCompletionCallback::RunWithParams(params); - } - - private: - net::SSLHostInfo* ssl_host_info_; -}; - -// Tests that we can delete a DiskCacheBasedSSLHostInfo object in a -// completion callback for DiskCacheBasedSSLHostInfo::WaitForDataReady. -TEST(DiskCacheBasedSSLHostInfo, DeleteInCallback) { - net::CertVerifier cert_verifier; - // Use the blocking mock backend factory to force asynchronous completion - // of ssl_host_info->WaitForDataReady(), so that the callback will run. - MockBlockingBackendFactory* factory = new MockBlockingBackendFactory(); - MockHttpCache cache(factory); - net::SSLConfig ssl_config; - net::SSLHostInfo* ssl_host_info = - new net::DiskCacheBasedSSLHostInfo("https://www.verisign.com", ssl_config, - &cert_verifier, cache.http_cache()); - ssl_host_info->Start(); - DeleteSSLHostInfoCompletionCallback callback(ssl_host_info); - int rv = ssl_host_info->WaitForDataReady(&callback); - EXPECT_EQ(net::ERR_IO_PENDING, rv); - // Now complete the backend creation and let the callback run. - factory->FinishCreation(); - EXPECT_EQ(net::OK, callback.GetResult(rv)); -} |