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

Side by Side Diff: net/dns/host_resolver_impl.h

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/fuzzed_host_resolver.cc ('k') | net/dns/host_resolver_impl.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 #ifndef NET_DNS_HOST_RESOLVER_IMPL_H_ 5 #ifndef NET_DNS_HOST_RESOLVER_IMPL_H_
6 #define NET_DNS_HOST_RESOLVER_IMPL_H_ 6 #define NET_DNS_HOST_RESOLVER_IMPL_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 14 matching lines...) Expand all
25 namespace net { 25 namespace net {
26 26
27 class AddressList; 27 class AddressList;
28 class BoundNetLog; 28 class BoundNetLog;
29 class DnsClient; 29 class DnsClient;
30 class IPAddress; 30 class IPAddress;
31 class NetLog; 31 class NetLog;
32 32
33 // For each hostname that is requested, HostResolver creates a 33 // For each hostname that is requested, HostResolver creates a
34 // HostResolverImpl::Job. When this job gets dispatched it creates a ProcTask 34 // HostResolverImpl::Job. When this job gets dispatched it creates a ProcTask
35 // which runs the given HostResolverProc on a WorkerPool thread. If requests for 35 // which runs the given HostResolverProc on a worker thread (a WorkerPool
36 // that same host are made during the job's lifetime, they are attached to the 36 // thread, in production code.) If requests for that same host are made during
37 // existing job rather than creating a new one. This avoids doing parallel 37 // the job's lifetime, they are attached to the existing job rather than
38 // resolves for the same host. 38 // creating a new one. This avoids doing parallel resolves for the same host.
39 // 39 //
40 // The way these classes fit together is illustrated by: 40 // The way these classes fit together is illustrated by:
41 // 41 //
42 // 42 //
43 // +----------- HostResolverImpl -------------+ 43 // +----------- HostResolverImpl -------------+
44 // | | | 44 // | | |
45 // Job Job Job 45 // Job Job Job
46 // (for host1, fam1) (for host2, fam2) (for hostx, famx) 46 // (for host1, fam1) (for host2, fam2) (for hostx, famx)
47 // / | | / | | / | | 47 // / | | / | | / | |
48 // Request ... Request Request ... Request Request ... Request 48 // Request ... Request Request ... Request Request ... Request
(...skipping 12 matching lines...) Expand all
61 class NET_EXPORT HostResolverImpl 61 class NET_EXPORT HostResolverImpl
62 : public HostResolver, 62 : public HostResolver,
63 NON_EXPORTED_BASE(public base::NonThreadSafe), 63 NON_EXPORTED_BASE(public base::NonThreadSafe),
64 public NetworkChangeNotifier::IPAddressObserver, 64 public NetworkChangeNotifier::IPAddressObserver,
65 public NetworkChangeNotifier::ConnectionTypeObserver, 65 public NetworkChangeNotifier::ConnectionTypeObserver,
66 public NetworkChangeNotifier::DNSObserver { 66 public NetworkChangeNotifier::DNSObserver {
67 public: 67 public:
68 // Parameters for ProcTask which resolves hostnames using HostResolveProc. 68 // Parameters for ProcTask which resolves hostnames using HostResolveProc.
69 // 69 //
70 // |resolver_proc| is used to perform the actual resolves; it must be 70 // |resolver_proc| is used to perform the actual resolves; it must be
71 // thread-safe since it is run from multiple worker threads. If 71 // thread-safe since it may be run from multiple worker threads. If
72 // |resolver_proc| is NULL then the default host resolver procedure is 72 // |resolver_proc| is NULL then the default host resolver procedure is
73 // used (which is SystemHostResolverProc except if overridden). 73 // used (which is SystemHostResolverProc except if overridden).
74 // 74 //
75 // For each attempt, we could start another attempt if host is not resolved 75 // For each attempt, we could start another attempt if host is not resolved
76 // within |unresponsive_delay| time. We keep attempting to resolve the host 76 // within |unresponsive_delay| time. We keep attempting to resolve the host
77 // for |max_retry_attempts|. For every retry attempt, we grow the 77 // for |max_retry_attempts|. For every retry attempt, we grow the
78 // |unresponsive_delay| by the |retry_factor| amount (that is retry interval 78 // |unresponsive_delay| by the |retry_factor| amount (that is retry interval
79 // is multiplied by the retry factor each time). Once we have retried 79 // is multiplied by the retry factor each time). Once we have retried
80 // |max_retry_attempts|, we give up on additional attempts. 80 // |max_retry_attempts|, we give up on additional attempts.
81 // 81 //
(...skipping 14 matching lines...) Expand all
96 size_t max_retry_attempts; 96 size_t max_retry_attempts;
97 97
98 // This is the limit after which we make another attempt to resolve the host 98 // This is the limit after which we make another attempt to resolve the host
99 // if the worker thread has not responded yet. 99 // if the worker thread has not responded yet.
100 base::TimeDelta unresponsive_delay; 100 base::TimeDelta unresponsive_delay;
101 101
102 // Factor to grow |unresponsive_delay| when we re-re-try. 102 // Factor to grow |unresponsive_delay| when we re-re-try.
103 uint32_t retry_factor; 103 uint32_t retry_factor;
104 }; 104 };
105 105
106 // Creates a HostResolver as specified by |options|. 106 // Creates a HostResolver as specified by |options|. Blocking tasks are run on
107 // the WorkerPool.
107 // 108 //
108 // If Options.enable_caching is true, a cache is created using 109 // If Options.enable_caching is true, a cache is created using
109 // HostCache::CreateDefaultCache(). Otherwise no cache is used. 110 // HostCache::CreateDefaultCache(). Otherwise no cache is used.
110 // 111 //
111 // Options.GetDispatcherLimits() determines the maximum number of jobs that 112 // Options.GetDispatcherLimits() determines the maximum number of jobs that
112 // the resolver will run at once. This upper-bounds the total number of 113 // the resolver will run at once. This upper-bounds the total number of
113 // outstanding DNS transactions (not counting retransmissions and retries). 114 // outstanding DNS transactions (not counting retransmissions and retries).
114 // 115 //
115 // |net_log| must remain valid for the life of the HostResolverImpl. 116 // |net_log| must remain valid for the life of the HostResolverImpl.
116 HostResolverImpl(const Options& options, NetLog* net_log); 117 HostResolverImpl(const Options& options, NetLog* net_log);
(...skipping 27 matching lines...) Expand all
144 RequestPriority priority) override; 145 RequestPriority priority) override;
145 void CancelRequest(RequestHandle req) override; 146 void CancelRequest(RequestHandle req) override;
146 void SetDnsClientEnabled(bool enabled) override; 147 void SetDnsClientEnabled(bool enabled) override;
147 HostCache* GetHostCache() override; 148 HostCache* GetHostCache() override;
148 std::unique_ptr<base::Value> GetDnsConfigAsValue() const override; 149 std::unique_ptr<base::Value> GetDnsConfigAsValue() const override;
149 150
150 void set_proc_params_for_test(const ProcTaskParams& proc_params) { 151 void set_proc_params_for_test(const ProcTaskParams& proc_params) {
151 proc_params_ = proc_params; 152 proc_params_ = proc_params;
152 } 153 }
153 154
155 protected:
156 // Just like the public constructor, but allows the task runner used for
157 // blocking tasks to be specified. Intended for testing only.
158 HostResolverImpl(const Options& options,
159 NetLog* net_log,
160 scoped_refptr<base::TaskRunner> worker_task_runner);
161
162 // Callback from HaveOnlyLoopbackAddresses probe.
163 void SetHaveOnlyLoopbackAddresses(bool result);
164
154 private: 165 private:
155 friend class HostResolverImplTest; 166 friend class HostResolverImplTest;
156 class Job; 167 class Job;
157 class ProcTask; 168 class ProcTask;
158 class LoopbackProbeJob; 169 class LoopbackProbeJob;
159 class DnsTask; 170 class DnsTask;
160 class Request; 171 class Request;
161 typedef HostCache::Key Key; 172 typedef HostCache::Key Key;
162 typedef std::map<Key, Job*> JobMap; 173 typedef std::map<Key, Job*> JobMap;
163 174
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 bool ServeFromHosts(const Key& key, 208 bool ServeFromHosts(const Key& key,
198 const RequestInfo& info, 209 const RequestInfo& info,
199 AddressList* addresses); 210 AddressList* addresses);
200 211
201 // If |key| is for a localhost name (RFC 6761), returns true and fills 212 // If |key| is for a localhost name (RFC 6761), returns true and fills
202 // |addresses| with the loopback IP. Otherwise returns false. 213 // |addresses| with the loopback IP. Otherwise returns false.
203 bool ServeLocalhost(const Key& key, 214 bool ServeLocalhost(const Key& key,
204 const RequestInfo& info, 215 const RequestInfo& info,
205 AddressList* addresses); 216 AddressList* addresses);
206 217
207 // Callback from HaveOnlyLoopbackAddresses probe.
208 void SetHaveOnlyLoopbackAddresses(bool result);
209
210 // Returns the (hostname, address_family) key to use for |info|, choosing an 218 // Returns the (hostname, address_family) key to use for |info|, choosing an
211 // "effective" address family by inheriting the resolver's default address 219 // "effective" address family by inheriting the resolver's default address
212 // family when the request leaves it unspecified. 220 // family when the request leaves it unspecified.
213 Key GetEffectiveKeyForRequest(const RequestInfo& info, 221 Key GetEffectiveKeyForRequest(const RequestInfo& info,
214 const IPAddress* ip_address, 222 const IPAddress* ip_address,
215 const BoundNetLog& net_log); 223 const BoundNetLog& net_log);
216 224
217 // Probes IPv6 support and returns true if IPv6 support is enabled. 225 // Probes IPv6 support and returns true if IPv6 support is enabled.
218 // Results are cached, i.e. when called repeatedly this method returns result 226 // Results are cached, i.e. when called repeatedly this method returns result
219 // from the first probe for some time before probing again. 227 // from the first probe for some time before probing again.
220 virtual bool IsIPv6Reachable(const BoundNetLog& net_log); 228 virtual bool IsIPv6Reachable(const BoundNetLog& net_log);
221 229
230 // Asynchronously checks if only loopback IPs are available.
231 virtual void RunLoopbackProbeJob();
232
222 // Records the result in cache if cache is present. 233 // Records the result in cache if cache is present.
223 void CacheResult(const Key& key, 234 void CacheResult(const Key& key,
224 const HostCache::Entry& entry, 235 const HostCache::Entry& entry,
225 base::TimeDelta ttl); 236 base::TimeDelta ttl);
226 237
227 // Removes |job| from |jobs_|, only if it exists. 238 // Removes |job| from |jobs_|, only if it exists.
228 void RemoveJob(Job* job); 239 void RemoveJob(Job* job);
229 240
230 // Aborts all in progress jobs with ERR_NETWORK_CHANGED and notifies their 241 // Aborts all in progress jobs with ERR_NETWORK_CHANGED and notifies their
231 // requests. Might start new jobs. 242 // requests. Might start new jobs.
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 // True iff ProcTask has successfully resolved a hostname known to have IPv6 315 // True iff ProcTask has successfully resolved a hostname known to have IPv6
305 // addresses using ADDRESS_FAMILY_UNSPECIFIED. Reset on IP address change. 316 // addresses using ADDRESS_FAMILY_UNSPECIFIED. Reset on IP address change.
306 bool resolved_known_ipv6_hostname_; 317 bool resolved_known_ipv6_hostname_;
307 318
308 // Any resolver flags that should be added to a request by default. 319 // Any resolver flags that should be added to a request by default.
309 HostResolverFlags additional_resolver_flags_; 320 HostResolverFlags additional_resolver_flags_;
310 321
311 // Allow fallback to ProcTask if DnsTask fails. 322 // Allow fallback to ProcTask if DnsTask fails.
312 bool fallback_to_proctask_; 323 bool fallback_to_proctask_;
313 324
325 // Task runner used for DNS lookups using the platform resolver, and other
326 // blocking operations. Usually just the WorkerPool's task runner for slow
327 // tasks, but can be overridden for tests.
328 scoped_refptr<base::TaskRunner> worker_task_runner_;
329
314 base::WeakPtrFactory<HostResolverImpl> weak_ptr_factory_; 330 base::WeakPtrFactory<HostResolverImpl> weak_ptr_factory_;
315 331
316 base::WeakPtrFactory<HostResolverImpl> probe_weak_ptr_factory_; 332 base::WeakPtrFactory<HostResolverImpl> probe_weak_ptr_factory_;
317 333
318 DISALLOW_COPY_AND_ASSIGN(HostResolverImpl); 334 DISALLOW_COPY_AND_ASSIGN(HostResolverImpl);
319 }; 335 };
320 336
321 // Resolves a local hostname (such as "localhost" or "localhost6") into 337 // Resolves a local hostname (such as "localhost" or "localhost6") into
322 // IP endpoints with the given port. Returns true if |host| is a local 338 // IP endpoints with the given port. Returns true if |host| is a local
323 // hostname and false otherwise. Special IPv6 names (e.g. "localhost6") 339 // hostname and false otherwise. Special IPv6 names (e.g. "localhost6")
324 // will resolve to an IPv6 address only, whereas other names will 340 // will resolve to an IPv6 address only, whereas other names will
325 // resolve to both IPv4 and IPv6. 341 // resolve to both IPv4 and IPv6.
326 // This function is only exposed so it can be unit-tested. 342 // This function is only exposed so it can be unit-tested.
327 // TODO(tfarina): It would be better to change the tests so this function 343 // TODO(tfarina): It would be better to change the tests so this function
328 // gets exercised indirectly through HostResolverImpl. 344 // gets exercised indirectly through HostResolverImpl.
329 NET_EXPORT_PRIVATE bool ResolveLocalHostname(base::StringPiece host, 345 NET_EXPORT_PRIVATE bool ResolveLocalHostname(base::StringPiece host,
330 uint16_t port, 346 uint16_t port,
331 AddressList* address_list); 347 AddressList* address_list);
332 348
333 } // namespace net 349 } // namespace net
334 350
335 #endif // NET_DNS_HOST_RESOLVER_IMPL_H_ 351 #endif // NET_DNS_HOST_RESOLVER_IMPL_H_
OLDNEW
« no previous file with comments | « net/dns/fuzzed_host_resolver.cc ('k') | net/dns/host_resolver_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698