Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4530)

Unified Diff: chrome/browser/local_discovery/service_discovery_client_mac.mm

Issue 1436373002: Fixed OSX crash in net::URLFetcherCore::URLFetcherCore (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@context5
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698