diff options
author | noamsml@chromium.org <noamsml@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-31 09:56:58 +0000 |
---|---|---|
committer | noamsml@chromium.org <noamsml@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-31 09:56:58 +0000 |
commit | 0449dd8e138fa03061f11edcb19c82e07e0b14db (patch) | |
tree | 2042aeabb7e36808dfe07d2403439476d091e17a | |
parent | 650c54abde51cfaa88a2677df8186b356daee5f9 (diff) | |
download | chromium_src-0449dd8e138fa03061f11edcb19c82e07e0b14db.zip chromium_src-0449dd8e138fa03061f11edcb19c82e07e0b14db.tar.gz chromium_src-0449dd8e138fa03061f11edcb19c82e07e0b14db.tar.bz2 |
Bugfix: LocalDomainResolver double-calls its callback
LocalDomainResolver double-callback if both A and AAAA records are
present. Fix to check if callback has been called before starting the second
transaction.
BUG=
Review URL: https://chromiumcodereview.appspot.com/21014008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214661 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/utility/local_discovery/local_domain_resolver_unittest.cc | 16 | ||||
-rw-r--r-- | chrome/utility/local_discovery/service_discovery_client_impl.cc | 17 |
2 files changed, 28 insertions, 5 deletions
diff --git a/chrome/utility/local_discovery/local_domain_resolver_unittest.cc b/chrome/utility/local_discovery/local_domain_resolver_unittest.cc index c1fd51c..fe1cebf 100644 --- a/chrome/utility/local_discovery/local_domain_resolver_unittest.cc +++ b/chrome/utility/local_discovery/local_domain_resolver_unittest.cc @@ -167,6 +167,22 @@ TEST_F(LocalDomainResolverTest, ResolveDomainNone) { RunFor(base::TimeDelta::FromSeconds(4)); } +TEST_F(LocalDomainResolverTest, ResolveDomainPreferAFromCache) { + socket_factory_->SimulateReceive( + kSamplePacketA, sizeof(kSamplePacketAAAA)); + socket_factory_->SimulateReceive( + kSamplePacketA, sizeof(kSamplePacketA)); + + LocalDomainResolverImpl resolver( + "myhello.local", net::ADDRESS_FAMILY_UNSPECIFIED, + base::Bind(&LocalDomainResolverTest::AddressCallback, + base::Unretained(this)), &mdns_client_); + + EXPECT_CALL(*this, AddressCallbackInternal(true, "1.2.3.4")); + + resolver.Start(); +} + } // namespace } // namespace local_discovery diff --git a/chrome/utility/local_discovery/service_discovery_client_impl.cc b/chrome/utility/local_discovery/service_discovery_client_impl.cc index 524f176..1df586d 100644 --- a/chrome/utility/local_discovery/service_discovery_client_impl.cc +++ b/chrome/utility/local_discovery/service_discovery_client_impl.cc @@ -406,10 +406,14 @@ void LocalDomainResolverImpl::Start() { transaction_a_->Start(); } - if (address_family_ == net::ADDRESS_FAMILY_IPV6 || - address_family_ == net::ADDRESS_FAMILY_UNSPECIFIED) { - transaction_aaaa_ = CreateTransaction(net::dns_protocol::kTypeAAAA); - transaction_aaaa_->Start(); + // Callback may have finished syncrhonously during |transaction_a_->Start()|, + // check to make sure it hasn't before starting |transaction_aaaa_|. + if (!callback_.is_null()) { + if (address_family_ == net::ADDRESS_FAMILY_IPV6 || + address_family_ == net::ADDRESS_FAMILY_UNSPECIFIED) { + transaction_aaaa_ = CreateTransaction(net::dns_protocol::kTypeAAAA); + transaction_aaaa_->Start(); + } } } @@ -449,7 +453,10 @@ void LocalDomainResolverImpl::OnTransactionComplete( } } - callback_.Run(result == net::MDnsTransaction::RESULT_RECORD, address); + if (!callback_.is_null()) { + callback_.Run(result == net::MDnsTransaction::RESULT_RECORD, address); + callback_.Reset(); + } } } // namespace local_discovery |