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

Side by Side Diff: jingle/notifier/base/chrome_async_socket.cc

Issue 3353003: Fixed crash involving using NetAddress::Adopt() incorrectly (Closed)
Patch Set: Created 10 years, 3 months 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
« no previous file with comments | « no previous file | net/base/address_list.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "jingle/notifier/base/chrome_async_socket.h" 5 #include "jingle/notifier/base/chrome_async_socket.h"
6 6
7 #if defined(OS_WIN) 7 #if defined(OS_WIN)
8 #include <winsock2.h> 8 #include <winsock2.h>
9 #elif defined(OS_POSIX) 9 #elif defined(OS_POSIX)
10 #include <arpa/inet.h> 10 #include <arpa/inet.h>
11 #endif 11 #endif
12 12
13 #include <algorithm> 13 #include <algorithm>
14 #include <cstring> 14 #include <cstring>
15 #include <cstdlib> 15 #include <cstdlib>
16 16
17 #include "base/basictypes.h"
17 #include "base/compiler_specific.h" 18 #include "base/compiler_specific.h"
18 #include "base/logging.h" 19 #include "base/logging.h"
19 #include "net/base/address_list.h" 20 #include "net/base/address_list.h"
20 #include "net/base/io_buffer.h" 21 #include "net/base/io_buffer.h"
22 #include "net/base/net_util.h"
21 #include "net/base/ssl_config_service.h" 23 #include "net/base/ssl_config_service.h"
22 #include "net/base/sys_addrinfo.h" 24 #include "net/base/sys_addrinfo.h"
23 #include "net/socket/client_socket_factory.h" 25 #include "net/socket/client_socket_factory.h"
24 #include "net/socket/ssl_client_socket.h" 26 #include "net/socket/ssl_client_socket.h"
25 #include "net/socket/tcp_client_socket.h" 27 #include "net/socket/tcp_client_socket.h"
26 #include "talk/base/socketaddress.h" 28 #include "talk/base/socketaddress.h"
27 29
28 namespace notifier { 30 namespace notifier {
29 31
30 ChromeAsyncSocket::ChromeAsyncSocket( 32 ChromeAsyncSocket::ChromeAsyncSocket(
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 net_error_ = net_error; 94 net_error_ = net_error;
93 } 95 }
94 96
95 void ChromeAsyncSocket::DoNetErrorFromStatus(int status) { 97 void ChromeAsyncSocket::DoNetErrorFromStatus(int status) {
96 DCHECK_LT(status, net::OK); 98 DCHECK_LT(status, net::OK);
97 DoNetError(static_cast<net::Error>(status)); 99 DoNetError(static_cast<net::Error>(status));
98 } 100 }
99 101
100 namespace { 102 namespace {
101 103
104 // Takes a 32-bit integer in host byte order and converts it to a
105 // net::IPAddressNumber.
106 net::IPAddressNumber Uint32ToIPAddressNumber(uint32 ip) {
107 uint32 ip_nbo = htonl(ip);
108 const unsigned char* const ip_start =
109 reinterpret_cast<const unsigned char*>(&ip_nbo);
110 return net::IPAddressNumber(ip_start, ip_start + (sizeof ip_nbo));
111 }
112
102 net::AddressList SocketAddressToAddressList( 113 net::AddressList SocketAddressToAddressList(
103 const talk_base::SocketAddress& address) { 114 const talk_base::SocketAddress& address) {
104 DCHECK_NE(address.ip(), 0U); 115 DCHECK_NE(address.ip(), 0U);
105 // Use malloc() as net::AddressList uses free(). 116 return net::AddressList(Uint32ToIPAddressNumber(address.ip()),
106 addrinfo* ai = static_cast<addrinfo*>(std::malloc(sizeof *ai)); 117 address.port(), false);
107 memset(ai, 0, sizeof *ai);
108 ai->ai_family = AF_INET;
109 ai->ai_socktype = SOCK_STREAM;
110 ai->ai_addrlen = sizeof(sockaddr_in);
111
112 sockaddr_in* addr = static_cast<sockaddr_in*>(std::malloc(sizeof *addr));
113 memset(addr, 0, sizeof *addr);
114 addr->sin_family = AF_INET;
115 addr->sin_addr.s_addr = htonl(address.ip());
116 addr->sin_port = htons(address.port());
117 ai->ai_addr = reinterpret_cast<sockaddr*>(addr);
118
119 net::AddressList address_list;
120 address_list.Adopt(ai);
121 return address_list;
122 } 118 }
123 119
124 } // namespace 120 } // namespace
125 121
126 // STATE_CLOSED -> STATE_CONNECTING 122 // STATE_CLOSED -> STATE_CONNECTING
127 123
128 bool ChromeAsyncSocket::Connect(const talk_base::SocketAddress& address) { 124 bool ChromeAsyncSocket::Connect(const talk_base::SocketAddress& address) {
129 if (state_ != STATE_CLOSED) { 125 if (state_ != STATE_CLOSED) {
130 LOG(DFATAL) << "Connect() called on non-closed socket"; 126 LOG(DFATAL) << "Connect() called on non-closed socket";
131 DoNonNetError(ERROR_WRONGSTATE); 127 DoNonNetError(ERROR_WRONGSTATE);
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 } 467 }
472 state_ = STATE_TLS_OPEN; 468 state_ = STATE_TLS_OPEN;
473 PostDoRead(); 469 PostDoRead();
474 if (write_end_ > 0U) { 470 if (write_end_ > 0U) {
475 PostDoWrite(); 471 PostDoWrite();
476 } 472 }
477 SignalSSLConnected(); 473 SignalSSLConnected();
478 } 474 }
479 475
480 } // namespace notifier 476 } // namespace notifier
OLDNEW
« no previous file with comments | « no previous file | net/base/address_list.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698