| Index: chrome/browser/local_discovery/service_discovery_client_mac.mm
|
| diff --git a/chrome/browser/local_discovery/service_discovery_client_mac.mm b/chrome/browser/local_discovery/service_discovery_client_mac.mm
|
| index 4a09e3e9a8084e10cf6c3a6c3ca2175dfac737a0..3c5fbd84645965570721f8aed798689bc5eac072 100644
|
| --- a/chrome/browser/local_discovery/service_discovery_client_mac.mm
|
| +++ b/chrome/browser/local_discovery/service_discovery_client_mac.mm
|
| @@ -8,12 +8,14 @@
|
| #import <Foundation/Foundation.h>
|
| #import <net/if_dl.h>
|
|
|
| +#include "base/debug/dump_without_crashing.h"
|
| #include "base/memory/singleton.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/thread_task_runner_handle.h"
|
| #include "base/threading/thread.h"
|
| #include "net/base/ip_address_number.h"
|
| +#include "net/base/ip_endpoint.h"
|
|
|
| using local_discovery::ServiceWatcherImplMac;
|
| using local_discovery::ServiceResolverImplMac;
|
| @@ -334,33 +336,42 @@ ServiceResolverImplMac::NetServiceContainer::StartResolvingOnDiscoveryThread() {
|
|
|
| void ServiceResolverImplMac::NetServiceContainer::OnResolveUpdate(
|
| RequestStatus status) {
|
| - if (status == STATUS_SUCCESS) {
|
| - service_description_.service_name = service_name_;
|
| -
|
| - for (NSData* address in [service_ addresses]) {
|
| - const void* bytes = [address bytes];
|
| - // TODO(justinlin): Handle IPv6 addresses?
|
| - if (static_cast<const sockaddr*>(bytes)->sa_family == AF_INET) {
|
| - const sockaddr_in* sock = static_cast<const sockaddr_in*>(bytes);
|
| - char addr[INET_ADDRSTRLEN];
|
| - inet_ntop(AF_INET, &sock->sin_addr, addr, INET_ADDRSTRLEN);
|
| - service_description_.address =
|
| - net::HostPortPair(addr, ntohs(sock->sin_port));
|
| - net::ParseIPLiteralToNumber(addr, &service_description_.ip_address);
|
| - break;
|
| - }
|
| - }
|
| + if (status != STATUS_SUCCESS) {
|
| + callback_runner_->PostTask(
|
| + FROM_HERE, base::Bind(callback_, status, ServiceDescription()));
|
| + return;
|
| + }
|
|
|
| - ParseTxtRecord([service_ TXTRecordData], &service_description_.metadata);
|
| + service_description_.service_name = service_name_;
|
| +
|
| + for (NSData* address in [service_ addresses]) {
|
| + const void* bytes = [address bytes];
|
| + int length = [address length];
|
| + const sockaddr* socket = static_cast<const sockaddr*>(bytes);
|
| + net::IPEndPoint end_point;
|
| + if (end_point.FromSockAddr(socket, length)) {
|
| + service_description_.address =
|
| + net::HostPortPair::FromIPEndPoint(end_point);
|
| + break;
|
| + }
|
| + }
|
|
|
| - // TODO(justinlin): Implement last_seen.
|
| - service_description_.last_seen = base::Time::Now();
|
| + if (service_description_.address.host().empty()) {
|
| + NOTREACHED() << service_name_;
|
| + // Unexpected, but could be a reason for crbug.com/513505
|
| + base::debug::DumpWithoutCrashing();
|
| callback_runner_->PostTask(
|
| - FROM_HERE, base::Bind(callback_, status, service_description_));
|
| - } else {
|
| - callback_runner_->PostTask(
|
| - FROM_HERE, base::Bind(callback_, status, ServiceDescription()));
|
| + FROM_HERE,
|
| + base::Bind(callback_, STATUS_KNOWN_NONEXISTENT, ServiceDescription()));
|
| + return;
|
| }
|
| +
|
| + ParseTxtRecord([service_ TXTRecordData], &service_description_.metadata);
|
| +
|
| + // TODO(justinlin): Implement last_seen.
|
| + service_description_.last_seen = base::Time::Now();
|
| + callback_runner_->PostTask(
|
| + FROM_HERE, base::Bind(callback_, status, service_description_));
|
| }
|
|
|
| void ServiceResolverImplMac::NetServiceContainer::SetServiceForTesting(
|
|
|