summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornoamsml@chromium.org <noamsml@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-31 09:56:58 +0000
committernoamsml@chromium.org <noamsml@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-31 09:56:58 +0000
commit0449dd8e138fa03061f11edcb19c82e07e0b14db (patch)
tree2042aeabb7e36808dfe07d2403439476d091e17a
parent650c54abde51cfaa88a2677df8186b356daee5f9 (diff)
downloadchromium_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.cc16
-rw-r--r--chrome/utility/local_discovery/service_discovery_client_impl.cc17
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