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

Side by Side Diff: net/dns/dns_socket_pool.cc

Issue 1946793002: net: Add fuzzer for HostResolverImpl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove port 0 check Created 4 years, 6 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 | « net/dns/dns_socket_pool.h ('k') | net/dns/dns_transaction_unittest.cc » ('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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "net/dns/dns_socket_pool.h" 5 #include "net/dns/dns_socket_pool.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "base/rand_util.h" 9 #include "base/rand_util.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
11 #include "net/base/address_list.h" 11 #include "net/base/address_list.h"
12 #include "net/base/ip_endpoint.h" 12 #include "net/base/ip_endpoint.h"
13 #include "net/base/net_errors.h" 13 #include "net/base/net_errors.h"
14 #include "net/base/rand_callback.h"
15 #include "net/socket/client_socket_factory.h" 14 #include "net/socket/client_socket_factory.h"
16 #include "net/socket/stream_socket.h" 15 #include "net/socket/stream_socket.h"
17 #include "net/udp/datagram_client_socket.h" 16 #include "net/udp/datagram_client_socket.h"
18 17
19 namespace net { 18 namespace net {
20 19
21 namespace { 20 namespace {
22 21
23 // When we initialize the SocketPool, we allocate kInitialPoolSize sockets. 22 // When we initialize the SocketPool, we allocate kInitialPoolSize sockets.
24 // When we allocate a socket, we ensure we have at least kAllocateMinSize 23 // When we allocate a socket, we ensure we have at least kAllocateMinSize
25 // sockets to choose from. Freed sockets are not retained. 24 // sockets to choose from. Freed sockets are not retained.
26 25
27 // On Windows, we can't request specific (random) ports, since that will 26 // On Windows, we can't request specific (random) ports, since that will
28 // trigger firewall prompts, so request default ones, but keep a pile of 27 // trigger firewall prompts, so request default ones, but keep a pile of
29 // them. Everywhere else, request fresh, random ports each time. 28 // them. Everywhere else, request fresh, random ports each time.
30 #if defined(OS_WIN) 29 #if defined(OS_WIN)
31 const DatagramSocket::BindType kBindType = DatagramSocket::DEFAULT_BIND; 30 const DatagramSocket::BindType kBindType = DatagramSocket::DEFAULT_BIND;
32 const unsigned kInitialPoolSize = 256; 31 const unsigned kInitialPoolSize = 256;
33 const unsigned kAllocateMinSize = 256; 32 const unsigned kAllocateMinSize = 256;
34 #else 33 #else
35 const DatagramSocket::BindType kBindType = DatagramSocket::RANDOM_BIND; 34 const DatagramSocket::BindType kBindType = DatagramSocket::RANDOM_BIND;
36 const unsigned kInitialPoolSize = 0; 35 const unsigned kInitialPoolSize = 0;
37 const unsigned kAllocateMinSize = 1; 36 const unsigned kAllocateMinSize = 1;
38 #endif 37 #endif
39 38
40 } // namespace 39 } // namespace
41 40
42 DnsSocketPool::DnsSocketPool(ClientSocketFactory* socket_factory) 41 DnsSocketPool::DnsSocketPool(ClientSocketFactory* socket_factory,
42 const RandIntCallback& rand_int_callback)
43 : socket_factory_(socket_factory), 43 : socket_factory_(socket_factory),
44 rand_int_callback_(rand_int_callback),
44 net_log_(NULL), 45 net_log_(NULL),
45 nameservers_(NULL), 46 nameservers_(NULL),
46 initialized_(false) { 47 initialized_(false) {}
47 }
48 48
49 void DnsSocketPool::InitializeInternal( 49 void DnsSocketPool::InitializeInternal(
50 const std::vector<IPEndPoint>* nameservers, 50 const std::vector<IPEndPoint>* nameservers,
51 NetLog* net_log) { 51 NetLog* net_log) {
52 DCHECK(nameservers); 52 DCHECK(nameservers);
53 DCHECK(!initialized_); 53 DCHECK(!initialized_);
54 54
55 net_log_ = net_log; 55 net_log_ = net_log;
56 nameservers_ = nameservers; 56 nameservers_ = nameservers;
57 initialized_ = true; 57 initialized_ = true;
(...skipping 10 matching lines...) Expand all
68 } 68 }
69 69
70 std::unique_ptr<DatagramClientSocket> DnsSocketPool::CreateConnectedSocket( 70 std::unique_ptr<DatagramClientSocket> DnsSocketPool::CreateConnectedSocket(
71 unsigned server_index) { 71 unsigned server_index) {
72 DCHECK_LT(server_index, nameservers_->size()); 72 DCHECK_LT(server_index, nameservers_->size());
73 73
74 std::unique_ptr<DatagramClientSocket> socket; 74 std::unique_ptr<DatagramClientSocket> socket;
75 75
76 NetLog::Source no_source; 76 NetLog::Source no_source;
77 socket = socket_factory_->CreateDatagramClientSocket( 77 socket = socket_factory_->CreateDatagramClientSocket(
78 kBindType, base::Bind(&base::RandInt), net_log_, no_source); 78 kBindType, rand_int_callback_, net_log_, no_source);
79 79
80 if (socket.get()) { 80 if (socket.get()) {
81 int rv = socket->Connect((*nameservers_)[server_index]); 81 int rv = socket->Connect((*nameservers_)[server_index]);
82 if (rv != OK) { 82 if (rv != OK) {
83 VLOG(1) << "Failed to connect socket: " << rv; 83 DVLOG(1) << "Failed to connect socket: " << rv;
84 socket.reset(); 84 socket.reset();
85 } 85 }
86 } else { 86 } else {
87 LOG(WARNING) << "Failed to create socket."; 87 DVLOG(1) << "Failed to create socket.";
88 } 88 }
89 89
90 return socket; 90 return socket;
91 } 91 }
92 92
93 int DnsSocketPool::GetRandomInt(int min, int max) {
94 return rand_int_callback_.Run(min, max);
95 }
96
93 class NullDnsSocketPool : public DnsSocketPool { 97 class NullDnsSocketPool : public DnsSocketPool {
94 public: 98 public:
95 NullDnsSocketPool(ClientSocketFactory* factory) 99 NullDnsSocketPool(ClientSocketFactory* factory,
96 : DnsSocketPool(factory) { 100 const RandIntCallback& rand_int_callback)
97 } 101 : DnsSocketPool(factory, rand_int_callback) {}
98 102
99 void Initialize(const std::vector<IPEndPoint>* nameservers, 103 void Initialize(const std::vector<IPEndPoint>* nameservers,
100 NetLog* net_log) override { 104 NetLog* net_log) override {
101 InitializeInternal(nameservers, net_log); 105 InitializeInternal(nameservers, net_log);
102 } 106 }
103 107
104 std::unique_ptr<DatagramClientSocket> AllocateSocket( 108 std::unique_ptr<DatagramClientSocket> AllocateSocket(
105 unsigned server_index) override { 109 unsigned server_index) override {
106 return CreateConnectedSocket(server_index); 110 return CreateConnectedSocket(server_index);
107 } 111 }
108 112
109 void FreeSocket(unsigned server_index, 113 void FreeSocket(unsigned server_index,
110 std::unique_ptr<DatagramClientSocket> socket) override {} 114 std::unique_ptr<DatagramClientSocket> socket) override {}
111 115
112 private: 116 private:
113 DISALLOW_COPY_AND_ASSIGN(NullDnsSocketPool); 117 DISALLOW_COPY_AND_ASSIGN(NullDnsSocketPool);
114 }; 118 };
115 119
116 // static 120 // static
117 std::unique_ptr<DnsSocketPool> DnsSocketPool::CreateNull( 121 std::unique_ptr<DnsSocketPool> DnsSocketPool::CreateNull(
118 ClientSocketFactory* factory) { 122 ClientSocketFactory* factory,
119 return std::unique_ptr<DnsSocketPool>(new NullDnsSocketPool(factory)); 123 const RandIntCallback& rand_int_callback) {
124 return std::unique_ptr<DnsSocketPool>(
125 new NullDnsSocketPool(factory, rand_int_callback));
120 } 126 }
121 127
122 class DefaultDnsSocketPool : public DnsSocketPool { 128 class DefaultDnsSocketPool : public DnsSocketPool {
123 public: 129 public:
124 DefaultDnsSocketPool(ClientSocketFactory* factory) 130 DefaultDnsSocketPool(ClientSocketFactory* factory,
125 : DnsSocketPool(factory) { 131 const RandIntCallback& rand_int_callback)
126 }; 132 : DnsSocketPool(factory, rand_int_callback){};
127 133
128 ~DefaultDnsSocketPool() override; 134 ~DefaultDnsSocketPool() override;
129 135
130 void Initialize(const std::vector<IPEndPoint>* nameservers, 136 void Initialize(const std::vector<IPEndPoint>* nameservers,
131 NetLog* net_log) override; 137 NetLog* net_log) override;
132 138
133 std::unique_ptr<DatagramClientSocket> AllocateSocket( 139 std::unique_ptr<DatagramClientSocket> AllocateSocket(
134 unsigned server_index) override; 140 unsigned server_index) override;
135 141
136 void FreeSocket(unsigned server_index, 142 void FreeSocket(unsigned server_index,
137 std::unique_ptr<DatagramClientSocket> socket) override; 143 std::unique_ptr<DatagramClientSocket> socket) override;
138 144
139 private: 145 private:
140 void FillPool(unsigned server_index, unsigned size); 146 void FillPool(unsigned server_index, unsigned size);
141 147
142 typedef std::vector<DatagramClientSocket*> SocketVector; 148 typedef std::vector<DatagramClientSocket*> SocketVector;
143 149
144 std::vector<SocketVector> pools_; 150 std::vector<SocketVector> pools_;
145 151
146 DISALLOW_COPY_AND_ASSIGN(DefaultDnsSocketPool); 152 DISALLOW_COPY_AND_ASSIGN(DefaultDnsSocketPool);
147 }; 153 };
148 154
149 // static 155 // static
150 std::unique_ptr<DnsSocketPool> DnsSocketPool::CreateDefault( 156 std::unique_ptr<DnsSocketPool> DnsSocketPool::CreateDefault(
151 ClientSocketFactory* factory) { 157 ClientSocketFactory* factory,
152 return std::unique_ptr<DnsSocketPool>(new DefaultDnsSocketPool(factory)); 158 const RandIntCallback& rand_int_callback) {
159 return std::unique_ptr<DnsSocketPool>(
160 new DefaultDnsSocketPool(factory, rand_int_callback));
153 } 161 }
154 162
155 void DefaultDnsSocketPool::Initialize( 163 void DefaultDnsSocketPool::Initialize(
156 const std::vector<IPEndPoint>* nameservers, 164 const std::vector<IPEndPoint>* nameservers,
157 NetLog* net_log) { 165 NetLog* net_log) {
158 InitializeInternal(nameservers, net_log); 166 InitializeInternal(nameservers, net_log);
159 167
160 DCHECK(pools_.empty()); 168 DCHECK(pools_.empty());
161 const unsigned num_servers = nameservers->size(); 169 const unsigned num_servers = nameservers->size();
162 pools_.resize(num_servers); 170 pools_.resize(num_servers);
163 for (unsigned server_index = 0; server_index < num_servers; ++server_index) 171 for (unsigned server_index = 0; server_index < num_servers; ++server_index)
164 FillPool(server_index, kInitialPoolSize); 172 FillPool(server_index, kInitialPoolSize);
165 } 173 }
166 174
167 DefaultDnsSocketPool::~DefaultDnsSocketPool() { 175 DefaultDnsSocketPool::~DefaultDnsSocketPool() {
168 unsigned num_servers = pools_.size(); 176 unsigned num_servers = pools_.size();
169 for (unsigned server_index = 0; server_index < num_servers; ++server_index) { 177 for (unsigned server_index = 0; server_index < num_servers; ++server_index) {
170 SocketVector& pool = pools_[server_index]; 178 SocketVector& pool = pools_[server_index];
171 STLDeleteElements(&pool); 179 STLDeleteElements(&pool);
172 } 180 }
173 } 181 }
174 182
175 std::unique_ptr<DatagramClientSocket> DefaultDnsSocketPool::AllocateSocket( 183 std::unique_ptr<DatagramClientSocket> DefaultDnsSocketPool::AllocateSocket(
176 unsigned server_index) { 184 unsigned server_index) {
177 DCHECK_LT(server_index, pools_.size()); 185 DCHECK_LT(server_index, pools_.size());
178 SocketVector& pool = pools_[server_index]; 186 SocketVector& pool = pools_[server_index];
179 187
180 FillPool(server_index, kAllocateMinSize); 188 FillPool(server_index, kAllocateMinSize);
181 if (pool.size() == 0) { 189 if (pool.size() == 0) {
182 LOG(WARNING) << "No DNS sockets available in pool " << server_index << "!"; 190 DVLOG(1) << "No DNS sockets available in pool " << server_index << "!";
183 return std::unique_ptr<DatagramClientSocket>(); 191 return std::unique_ptr<DatagramClientSocket>();
184 } 192 }
185 193
186 if (pool.size() < kAllocateMinSize) { 194 if (pool.size() < kAllocateMinSize) {
187 LOG(WARNING) << "Low DNS port entropy: wanted " << kAllocateMinSize 195 DVLOG(1) << "Low DNS port entropy: wanted " << kAllocateMinSize
188 << " sockets to choose from, but only have " << pool.size() 196 << " sockets to choose from, but only have " << pool.size()
189 << " in pool " << server_index << "."; 197 << " in pool " << server_index << ".";
190 } 198 }
191 199
192 unsigned socket_index = base::RandInt(0, pool.size() - 1); 200 unsigned socket_index = GetRandomInt(0, pool.size() - 1);
193 DatagramClientSocket* socket = pool[socket_index]; 201 DatagramClientSocket* socket = pool[socket_index];
194 pool[socket_index] = pool.back(); 202 pool[socket_index] = pool.back();
195 pool.pop_back(); 203 pool.pop_back();
196 204
197 return std::unique_ptr<DatagramClientSocket>(socket); 205 return std::unique_ptr<DatagramClientSocket>(socket);
198 } 206 }
199 207
200 void DefaultDnsSocketPool::FreeSocket( 208 void DefaultDnsSocketPool::FreeSocket(
201 unsigned server_index, 209 unsigned server_index,
202 std::unique_ptr<DatagramClientSocket> socket) { 210 std::unique_ptr<DatagramClientSocket> socket) {
203 DCHECK_LT(server_index, pools_.size()); 211 DCHECK_LT(server_index, pools_.size());
204 } 212 }
205 213
206 void DefaultDnsSocketPool::FillPool(unsigned server_index, unsigned size) { 214 void DefaultDnsSocketPool::FillPool(unsigned server_index, unsigned size) {
207 SocketVector& pool = pools_[server_index]; 215 SocketVector& pool = pools_[server_index];
208 216
209 for (unsigned pool_index = pool.size(); pool_index < size; ++pool_index) { 217 for (unsigned pool_index = pool.size(); pool_index < size; ++pool_index) {
210 DatagramClientSocket* socket = 218 DatagramClientSocket* socket =
211 CreateConnectedSocket(server_index).release(); 219 CreateConnectedSocket(server_index).release();
212 if (!socket) 220 if (!socket)
213 break; 221 break;
214 pool.push_back(socket); 222 pool.push_back(socket);
215 } 223 }
216 } 224 }
217 225
218 } // namespace net 226 } // namespace net
OLDNEW
« no previous file with comments | « net/dns/dns_socket_pool.h ('k') | net/dns/dns_transaction_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698