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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/local_discovery/service_discovery_client_mac.h" 5 #include "chrome/browser/local_discovery/service_discovery_client_mac.h"
6 6
7 #import <arpa/inet.h> 7 #import <arpa/inet.h>
8 #import <Foundation/Foundation.h> 8 #import <Foundation/Foundation.h>
9 #import <net/if_dl.h> 9 #import <net/if_dl.h>
10 10
11 #include "base/debug/dump_without_crashing.h"
11 #include "base/memory/singleton.h" 12 #include "base/memory/singleton.h"
12 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
13 #include "base/single_thread_task_runner.h" 14 #include "base/single_thread_task_runner.h"
14 #include "base/thread_task_runner_handle.h" 15 #include "base/thread_task_runner_handle.h"
15 #include "base/threading/thread.h" 16 #include "base/threading/thread.h"
16 #include "net/base/ip_address_number.h" 17 #include "net/base/ip_address_number.h"
18 #include "net/base/ip_endpoint.h"
17 19
18 using local_discovery::ServiceWatcherImplMac; 20 using local_discovery::ServiceWatcherImplMac;
19 using local_discovery::ServiceResolverImplMac; 21 using local_discovery::ServiceResolverImplMac;
20 22
21 @interface NetServiceBrowserDelegate 23 @interface NetServiceBrowserDelegate
22 : NSObject<NSNetServiceBrowserDelegate, NSNetServiceDelegate> { 24 : NSObject<NSNetServiceBrowserDelegate, NSNetServiceDelegate> {
23 @private 25 @private
24 ServiceWatcherImplMac::NetServiceBrowserContainer* container_; // weak. 26 ServiceWatcherImplMac::NetServiceBrowserContainer* container_; // weak.
25 base::scoped_nsobject<NSMutableArray> services_; 27 base::scoped_nsobject<NSMutableArray> services_;
26 } 28 }
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 [service_ resolveWithTimeout:kResolveTimeout]; 329 [service_ resolveWithTimeout:kResolveTimeout];
328 330
329 VLOG(1) << "ServiceResolverImplMac::NetServiceContainer::" 331 VLOG(1) << "ServiceResolverImplMac::NetServiceContainer::"
330 << "StartResolvingOnDiscoveryThread: " << service_name_ 332 << "StartResolvingOnDiscoveryThread: " << service_name_
331 << ", instance: " << instance << ", type: " << type 333 << ", instance: " << instance << ", type: " << type
332 << ", domain: " << domain; 334 << ", domain: " << domain;
333 } 335 }
334 336
335 void ServiceResolverImplMac::NetServiceContainer::OnResolveUpdate( 337 void ServiceResolverImplMac::NetServiceContainer::OnResolveUpdate(
336 RequestStatus status) { 338 RequestStatus status) {
337 if (status == STATUS_SUCCESS) { 339 if (status != STATUS_SUCCESS) {
338 service_description_.service_name = service_name_;
339
340 for (NSData* address in [service_ addresses]) {
341 const void* bytes = [address bytes];
342 // TODO(justinlin): Handle IPv6 addresses?
343 if (static_cast<const sockaddr*>(bytes)->sa_family == AF_INET) {
344 const sockaddr_in* sock = static_cast<const sockaddr_in*>(bytes);
345 char addr[INET_ADDRSTRLEN];
346 inet_ntop(AF_INET, &sock->sin_addr, addr, INET_ADDRSTRLEN);
347 service_description_.address =
348 net::HostPortPair(addr, ntohs(sock->sin_port));
349 net::ParseIPLiteralToNumber(addr, &service_description_.ip_address);
350 break;
351 }
352 }
353
354 ParseTxtRecord([service_ TXTRecordData], &service_description_.metadata);
355
356 // TODO(justinlin): Implement last_seen.
357 service_description_.last_seen = base::Time::Now();
358 callback_runner_->PostTask(
359 FROM_HERE, base::Bind(callback_, status, service_description_));
360 } else {
361 callback_runner_->PostTask( 340 callback_runner_->PostTask(
362 FROM_HERE, base::Bind(callback_, status, ServiceDescription())); 341 FROM_HERE, base::Bind(callback_, status, ServiceDescription()));
342 return;
363 } 343 }
344
345 service_description_.service_name = service_name_;
346
347 for (NSData* address in [service_ addresses]) {
348 const void* bytes = [address bytes];
349 int length = [address length];
350 const sockaddr* socket = static_cast<const sockaddr*>(bytes);
351 net::IPEndPoint end_point;
352 if (end_point.FromSockAddr(socket, length)) {
353 service_description_.address =
354 net::HostPortPair::FromIPEndPoint(end_point);
355 break;
356 }
357 }
358
359 if (service_description_.address.host().empty()) {
360 NOTREACHED() << service_name_;
361 // Unexpected, but could be a reason for crbug.com/513505
362 base::debug::DumpWithoutCrashing();
363 callback_runner_->PostTask(
364 FROM_HERE,
365 base::Bind(callback_, STATUS_KNOWN_NONEXISTENT, ServiceDescription()));
366 return;
367 }
368
369 ParseTxtRecord([service_ TXTRecordData], &service_description_.metadata);
370
371 // TODO(justinlin): Implement last_seen.
372 service_description_.last_seen = base::Time::Now();
373 callback_runner_->PostTask(
374 FROM_HERE, base::Bind(callback_, status, service_description_));
364 } 375 }
365 376
366 void ServiceResolverImplMac::NetServiceContainer::SetServiceForTesting( 377 void ServiceResolverImplMac::NetServiceContainer::SetServiceForTesting(
367 base::scoped_nsobject<NSNetService> service) { 378 base::scoped_nsobject<NSNetService> service) {
368 service_ = service; 379 service_ = service;
369 } 380 }
370 381
371 ServiceResolverImplMac::ServiceResolverImplMac( 382 ServiceResolverImplMac::ServiceResolverImplMac(
372 const std::string& service_name, 383 const std::string& service_name,
373 const ServiceResolver::ResolveCompleteCallback& callback, 384 const ServiceResolver::ResolveCompleteCallback& callback,
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 container_->OnResolveUpdate(local_discovery::ServiceResolver::STATUS_SUCCESS); 482 container_->OnResolveUpdate(local_discovery::ServiceResolver::STATUS_SUCCESS);
472 } 483 }
473 484
474 - (void)netService:(NSNetService *)sender 485 - (void)netService:(NSNetService *)sender
475 didNotResolve:(NSDictionary *)errorDict { 486 didNotResolve:(NSDictionary *)errorDict {
476 container_->OnResolveUpdate( 487 container_->OnResolveUpdate(
477 local_discovery::ServiceResolver::STATUS_REQUEST_TIMEOUT); 488 local_discovery::ServiceResolver::STATUS_REQUEST_TIMEOUT);
478 } 489 }
479 490
480 @end 491 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698