xref: /aosp_15_r20/external/cronet/net/socket/fuzzed_socket.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2016 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/socket/fuzzed_socket.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <fuzzer/FuzzedDataProvider.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_source_type.h"
17*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h"
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker namespace net {
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker namespace {
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker const int kMaxAsyncReadsAndWrites = 1000;
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker // Some of the socket errors that can be returned by normal socket connection
26*6777b538SAndroid Build Coastguard Worker // attempts.
27*6777b538SAndroid Build Coastguard Worker const Error kConnectErrors[] = {
28*6777b538SAndroid Build Coastguard Worker     ERR_CONNECTION_RESET,     ERR_CONNECTION_CLOSED, ERR_FAILED,
29*6777b538SAndroid Build Coastguard Worker     ERR_CONNECTION_TIMED_OUT, ERR_ACCESS_DENIED,     ERR_CONNECTION_REFUSED,
30*6777b538SAndroid Build Coastguard Worker     ERR_ADDRESS_UNREACHABLE};
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker // Some of the socket errors that can be returned by normal socket reads /
33*6777b538SAndroid Build Coastguard Worker // writes. The first one is returned when no more input data remains, so it's
34*6777b538SAndroid Build Coastguard Worker // one of the most common ones.
35*6777b538SAndroid Build Coastguard Worker const Error kReadWriteErrors[] = {ERR_CONNECTION_CLOSED, ERR_FAILED,
36*6777b538SAndroid Build Coastguard Worker                                   ERR_TIMED_OUT, ERR_CONNECTION_RESET};
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker }  // namespace
39*6777b538SAndroid Build Coastguard Worker 
FuzzedSocket(FuzzedDataProvider * data_provider,net::NetLog * net_log)40*6777b538SAndroid Build Coastguard Worker FuzzedSocket::FuzzedSocket(FuzzedDataProvider* data_provider,
41*6777b538SAndroid Build Coastguard Worker                            net::NetLog* net_log)
42*6777b538SAndroid Build Coastguard Worker     : data_provider_(data_provider),
43*6777b538SAndroid Build Coastguard Worker       net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
44*6777b538SAndroid Build Coastguard Worker       remote_address_(IPEndPoint(IPAddress::IPv4Localhost(), 80)) {}
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker FuzzedSocket::~FuzzedSocket() = default;
47*6777b538SAndroid Build Coastguard Worker 
Read(IOBuffer * buf,int buf_len,CompletionOnceCallback callback)48*6777b538SAndroid Build Coastguard Worker int FuzzedSocket::Read(IOBuffer* buf,
49*6777b538SAndroid Build Coastguard Worker                        int buf_len,
50*6777b538SAndroid Build Coastguard Worker                        CompletionOnceCallback callback) {
51*6777b538SAndroid Build Coastguard Worker   DCHECK(!connect_pending_);
52*6777b538SAndroid Build Coastguard Worker   DCHECK(!read_pending_);
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   bool sync;
55*6777b538SAndroid Build Coastguard Worker   int result;
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   if (net_error_ != OK) {
58*6777b538SAndroid Build Coastguard Worker     // If an error has already been generated, use it to determine what to do.
59*6777b538SAndroid Build Coastguard Worker     result = net_error_;
60*6777b538SAndroid Build Coastguard Worker     sync = !error_pending_;
61*6777b538SAndroid Build Coastguard Worker   } else {
62*6777b538SAndroid Build Coastguard Worker     // Otherwise, use |data_provider_|. Always consume a bool, even when
63*6777b538SAndroid Build Coastguard Worker     // ForceSync() is true, to behave more consistently against input mutations.
64*6777b538SAndroid Build Coastguard Worker     sync = data_provider_->ConsumeBool() || ForceSync();
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker     num_async_reads_and_writes_ += static_cast<int>(!sync);
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker     std::string data = data_provider_->ConsumeRandomLengthString(buf_len);
69*6777b538SAndroid Build Coastguard Worker     result = data.size();
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker     if (!data.empty()) {
72*6777b538SAndroid Build Coastguard Worker       base::ranges::copy(data, buf->data());
73*6777b538SAndroid Build Coastguard Worker     } else {
74*6777b538SAndroid Build Coastguard Worker       result = ConsumeReadWriteErrorFromData();
75*6777b538SAndroid Build Coastguard Worker       net_error_ = result;
76*6777b538SAndroid Build Coastguard Worker       if (!sync)
77*6777b538SAndroid Build Coastguard Worker         error_pending_ = true;
78*6777b538SAndroid Build Coastguard Worker     }
79*6777b538SAndroid Build Coastguard Worker   }
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker   // Graceful close of a socket returns OK, at least in theory. This doesn't
82*6777b538SAndroid Build Coastguard Worker   // perfectly reflect real socket behavior, but close enough.
83*6777b538SAndroid Build Coastguard Worker   if (result == ERR_CONNECTION_CLOSED)
84*6777b538SAndroid Build Coastguard Worker     result = 0;
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker   if (sync) {
87*6777b538SAndroid Build Coastguard Worker     if (result > 0)
88*6777b538SAndroid Build Coastguard Worker       total_bytes_read_ += result;
89*6777b538SAndroid Build Coastguard Worker     return result;
90*6777b538SAndroid Build Coastguard Worker   }
91*6777b538SAndroid Build Coastguard Worker 
92*6777b538SAndroid Build Coastguard Worker   read_pending_ = true;
93*6777b538SAndroid Build Coastguard Worker   base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
94*6777b538SAndroid Build Coastguard Worker       FROM_HERE,
95*6777b538SAndroid Build Coastguard Worker       base::BindOnce(&FuzzedSocket::OnReadComplete, weak_factory_.GetWeakPtr(),
96*6777b538SAndroid Build Coastguard Worker                      std::move(callback), result));
97*6777b538SAndroid Build Coastguard Worker   return ERR_IO_PENDING;
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker 
Write(IOBuffer * buf,int buf_len,CompletionOnceCallback callback,const NetworkTrafficAnnotationTag &)100*6777b538SAndroid Build Coastguard Worker int FuzzedSocket::Write(
101*6777b538SAndroid Build Coastguard Worker     IOBuffer* buf,
102*6777b538SAndroid Build Coastguard Worker     int buf_len,
103*6777b538SAndroid Build Coastguard Worker     CompletionOnceCallback callback,
104*6777b538SAndroid Build Coastguard Worker     const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
105*6777b538SAndroid Build Coastguard Worker   DCHECK(!connect_pending_);
106*6777b538SAndroid Build Coastguard Worker   DCHECK(!write_pending_);
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   bool sync;
109*6777b538SAndroid Build Coastguard Worker   int result;
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker   if (net_error_ != OK) {
112*6777b538SAndroid Build Coastguard Worker     // If an error has already been generated, use it to determine what to do.
113*6777b538SAndroid Build Coastguard Worker     result = net_error_;
114*6777b538SAndroid Build Coastguard Worker     sync = !error_pending_;
115*6777b538SAndroid Build Coastguard Worker   } else {
116*6777b538SAndroid Build Coastguard Worker     // Otherwise, use |data_provider_|. Always consume a bool, even when
117*6777b538SAndroid Build Coastguard Worker     // ForceSync() is true, to behave more consistently against input mutations.
118*6777b538SAndroid Build Coastguard Worker     sync = data_provider_->ConsumeBool() || ForceSync();
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker     num_async_reads_and_writes_ += static_cast<int>(!sync);
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker     // Intentionally using smaller |result| size here.
123*6777b538SAndroid Build Coastguard Worker     result = data_provider_->ConsumeIntegralInRange<int>(0, 0xFF);
124*6777b538SAndroid Build Coastguard Worker     if (result > buf_len)
125*6777b538SAndroid Build Coastguard Worker       result = buf_len;
126*6777b538SAndroid Build Coastguard Worker     if (result == 0) {
127*6777b538SAndroid Build Coastguard Worker       net_error_ = ConsumeReadWriteErrorFromData();
128*6777b538SAndroid Build Coastguard Worker       result = net_error_;
129*6777b538SAndroid Build Coastguard Worker       if (!sync)
130*6777b538SAndroid Build Coastguard Worker         error_pending_ = true;
131*6777b538SAndroid Build Coastguard Worker     }
132*6777b538SAndroid Build Coastguard Worker   }
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker   if (sync) {
135*6777b538SAndroid Build Coastguard Worker     if (result > 0)
136*6777b538SAndroid Build Coastguard Worker       total_bytes_written_ += result;
137*6777b538SAndroid Build Coastguard Worker     return result;
138*6777b538SAndroid Build Coastguard Worker   }
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker   write_pending_ = true;
141*6777b538SAndroid Build Coastguard Worker   base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
142*6777b538SAndroid Build Coastguard Worker       FROM_HERE,
143*6777b538SAndroid Build Coastguard Worker       base::BindOnce(&FuzzedSocket::OnWriteComplete, weak_factory_.GetWeakPtr(),
144*6777b538SAndroid Build Coastguard Worker                      std::move(callback), result));
145*6777b538SAndroid Build Coastguard Worker   return ERR_IO_PENDING;
146*6777b538SAndroid Build Coastguard Worker }
147*6777b538SAndroid Build Coastguard Worker 
SetReceiveBufferSize(int32_t size)148*6777b538SAndroid Build Coastguard Worker int FuzzedSocket::SetReceiveBufferSize(int32_t size) {
149*6777b538SAndroid Build Coastguard Worker   return OK;
150*6777b538SAndroid Build Coastguard Worker }
151*6777b538SAndroid Build Coastguard Worker 
SetSendBufferSize(int32_t size)152*6777b538SAndroid Build Coastguard Worker int FuzzedSocket::SetSendBufferSize(int32_t size) {
153*6777b538SAndroid Build Coastguard Worker   return OK;
154*6777b538SAndroid Build Coastguard Worker }
155*6777b538SAndroid Build Coastguard Worker 
Bind(const net::IPEndPoint & local_addr)156*6777b538SAndroid Build Coastguard Worker int FuzzedSocket::Bind(const net::IPEndPoint& local_addr) {
157*6777b538SAndroid Build Coastguard Worker   NOTREACHED();
158*6777b538SAndroid Build Coastguard Worker   return ERR_NOT_IMPLEMENTED;
159*6777b538SAndroid Build Coastguard Worker }
160*6777b538SAndroid Build Coastguard Worker 
Connect(CompletionOnceCallback callback)161*6777b538SAndroid Build Coastguard Worker int FuzzedSocket::Connect(CompletionOnceCallback callback) {
162*6777b538SAndroid Build Coastguard Worker   // Sockets can normally be reused, but don't support it here.
163*6777b538SAndroid Build Coastguard Worker   DCHECK_NE(net_error_, OK);
164*6777b538SAndroid Build Coastguard Worker   DCHECK(!connect_pending_);
165*6777b538SAndroid Build Coastguard Worker   DCHECK(!read_pending_);
166*6777b538SAndroid Build Coastguard Worker   DCHECK(!write_pending_);
167*6777b538SAndroid Build Coastguard Worker   DCHECK(!error_pending_);
168*6777b538SAndroid Build Coastguard Worker   DCHECK(!total_bytes_read_);
169*6777b538SAndroid Build Coastguard Worker   DCHECK(!total_bytes_written_);
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker   bool sync = true;
172*6777b538SAndroid Build Coastguard Worker   Error result = OK;
173*6777b538SAndroid Build Coastguard Worker   if (fuzz_connect_result_) {
174*6777b538SAndroid Build Coastguard Worker     // Decide if sync or async. Use async, if no data is left.
175*6777b538SAndroid Build Coastguard Worker     sync = data_provider_->ConsumeBool();
176*6777b538SAndroid Build Coastguard Worker     // Decide if the connect succeeds or not, and if so, pick an error code.
177*6777b538SAndroid Build Coastguard Worker     if (data_provider_->ConsumeBool())
178*6777b538SAndroid Build Coastguard Worker       result = data_provider_->PickValueInArray(kConnectErrors);
179*6777b538SAndroid Build Coastguard Worker   }
180*6777b538SAndroid Build Coastguard Worker 
181*6777b538SAndroid Build Coastguard Worker   if (sync) {
182*6777b538SAndroid Build Coastguard Worker     net_error_ = result;
183*6777b538SAndroid Build Coastguard Worker     return result;
184*6777b538SAndroid Build Coastguard Worker   }
185*6777b538SAndroid Build Coastguard Worker 
186*6777b538SAndroid Build Coastguard Worker   connect_pending_ = true;
187*6777b538SAndroid Build Coastguard Worker   if (result != OK)
188*6777b538SAndroid Build Coastguard Worker     error_pending_ = true;
189*6777b538SAndroid Build Coastguard Worker   base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
190*6777b538SAndroid Build Coastguard Worker       FROM_HERE,
191*6777b538SAndroid Build Coastguard Worker       base::BindOnce(&FuzzedSocket::OnConnectComplete,
192*6777b538SAndroid Build Coastguard Worker                      weak_factory_.GetWeakPtr(), std::move(callback), result));
193*6777b538SAndroid Build Coastguard Worker   return ERR_IO_PENDING;
194*6777b538SAndroid Build Coastguard Worker }
195*6777b538SAndroid Build Coastguard Worker 
Disconnect()196*6777b538SAndroid Build Coastguard Worker void FuzzedSocket::Disconnect() {
197*6777b538SAndroid Build Coastguard Worker   net_error_ = ERR_CONNECTION_CLOSED;
198*6777b538SAndroid Build Coastguard Worker   weak_factory_.InvalidateWeakPtrs();
199*6777b538SAndroid Build Coastguard Worker   connect_pending_ = false;
200*6777b538SAndroid Build Coastguard Worker   read_pending_ = false;
201*6777b538SAndroid Build Coastguard Worker   write_pending_ = false;
202*6777b538SAndroid Build Coastguard Worker   error_pending_ = false;
203*6777b538SAndroid Build Coastguard Worker }
204*6777b538SAndroid Build Coastguard Worker 
IsConnected() const205*6777b538SAndroid Build Coastguard Worker bool FuzzedSocket::IsConnected() const {
206*6777b538SAndroid Build Coastguard Worker   return net_error_ == OK && !error_pending_;
207*6777b538SAndroid Build Coastguard Worker }
208*6777b538SAndroid Build Coastguard Worker 
IsConnectedAndIdle() const209*6777b538SAndroid Build Coastguard Worker bool FuzzedSocket::IsConnectedAndIdle() const {
210*6777b538SAndroid Build Coastguard Worker   return IsConnected();
211*6777b538SAndroid Build Coastguard Worker }
212*6777b538SAndroid Build Coastguard Worker 
GetPeerAddress(IPEndPoint * address) const213*6777b538SAndroid Build Coastguard Worker int FuzzedSocket::GetPeerAddress(IPEndPoint* address) const {
214*6777b538SAndroid Build Coastguard Worker   if (!IsConnected())
215*6777b538SAndroid Build Coastguard Worker     return ERR_SOCKET_NOT_CONNECTED;
216*6777b538SAndroid Build Coastguard Worker   *address = remote_address_;
217*6777b538SAndroid Build Coastguard Worker   return OK;
218*6777b538SAndroid Build Coastguard Worker }
219*6777b538SAndroid Build Coastguard Worker 
GetLocalAddress(IPEndPoint * address) const220*6777b538SAndroid Build Coastguard Worker int FuzzedSocket::GetLocalAddress(IPEndPoint* address) const {
221*6777b538SAndroid Build Coastguard Worker   if (!IsConnected())
222*6777b538SAndroid Build Coastguard Worker     return ERR_SOCKET_NOT_CONNECTED;
223*6777b538SAndroid Build Coastguard Worker   *address = IPEndPoint(IPAddress(127, 0, 0, 1), 43434);
224*6777b538SAndroid Build Coastguard Worker   return OK;
225*6777b538SAndroid Build Coastguard Worker }
226*6777b538SAndroid Build Coastguard Worker 
NetLog() const227*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& FuzzedSocket::NetLog() const {
228*6777b538SAndroid Build Coastguard Worker   return net_log_;
229*6777b538SAndroid Build Coastguard Worker }
230*6777b538SAndroid Build Coastguard Worker 
WasEverUsed() const231*6777b538SAndroid Build Coastguard Worker bool FuzzedSocket::WasEverUsed() const {
232*6777b538SAndroid Build Coastguard Worker   return total_bytes_written_ != 0 || total_bytes_read_ != 0;
233*6777b538SAndroid Build Coastguard Worker }
234*6777b538SAndroid Build Coastguard Worker 
GetNegotiatedProtocol() const235*6777b538SAndroid Build Coastguard Worker NextProto FuzzedSocket::GetNegotiatedProtocol() const {
236*6777b538SAndroid Build Coastguard Worker   return kProtoUnknown;
237*6777b538SAndroid Build Coastguard Worker }
238*6777b538SAndroid Build Coastguard Worker 
GetSSLInfo(SSLInfo * ssl_info)239*6777b538SAndroid Build Coastguard Worker bool FuzzedSocket::GetSSLInfo(SSLInfo* ssl_info) {
240*6777b538SAndroid Build Coastguard Worker   return false;
241*6777b538SAndroid Build Coastguard Worker }
242*6777b538SAndroid Build Coastguard Worker 
GetTotalReceivedBytes() const243*6777b538SAndroid Build Coastguard Worker int64_t FuzzedSocket::GetTotalReceivedBytes() const {
244*6777b538SAndroid Build Coastguard Worker   return total_bytes_read_;
245*6777b538SAndroid Build Coastguard Worker }
246*6777b538SAndroid Build Coastguard Worker 
ApplySocketTag(const net::SocketTag & tag)247*6777b538SAndroid Build Coastguard Worker void FuzzedSocket::ApplySocketTag(const net::SocketTag& tag) {}
248*6777b538SAndroid Build Coastguard Worker 
ConsumeReadWriteErrorFromData()249*6777b538SAndroid Build Coastguard Worker Error FuzzedSocket::ConsumeReadWriteErrorFromData() {
250*6777b538SAndroid Build Coastguard Worker   return data_provider_->PickValueInArray(kReadWriteErrors);
251*6777b538SAndroid Build Coastguard Worker }
252*6777b538SAndroid Build Coastguard Worker 
OnReadComplete(CompletionOnceCallback callback,int result)253*6777b538SAndroid Build Coastguard Worker void FuzzedSocket::OnReadComplete(CompletionOnceCallback callback, int result) {
254*6777b538SAndroid Build Coastguard Worker   CHECK(read_pending_);
255*6777b538SAndroid Build Coastguard Worker   read_pending_ = false;
256*6777b538SAndroid Build Coastguard Worker   if (result <= 0) {
257*6777b538SAndroid Build Coastguard Worker     error_pending_ = false;
258*6777b538SAndroid Build Coastguard Worker   } else {
259*6777b538SAndroid Build Coastguard Worker     total_bytes_read_ += result;
260*6777b538SAndroid Build Coastguard Worker   }
261*6777b538SAndroid Build Coastguard Worker   std::move(callback).Run(result);
262*6777b538SAndroid Build Coastguard Worker }
263*6777b538SAndroid Build Coastguard Worker 
OnWriteComplete(CompletionOnceCallback callback,int result)264*6777b538SAndroid Build Coastguard Worker void FuzzedSocket::OnWriteComplete(CompletionOnceCallback callback,
265*6777b538SAndroid Build Coastguard Worker                                    int result) {
266*6777b538SAndroid Build Coastguard Worker   CHECK(write_pending_);
267*6777b538SAndroid Build Coastguard Worker   write_pending_ = false;
268*6777b538SAndroid Build Coastguard Worker   if (result <= 0) {
269*6777b538SAndroid Build Coastguard Worker     error_pending_ = false;
270*6777b538SAndroid Build Coastguard Worker   } else {
271*6777b538SAndroid Build Coastguard Worker     total_bytes_written_ += result;
272*6777b538SAndroid Build Coastguard Worker   }
273*6777b538SAndroid Build Coastguard Worker   std::move(callback).Run(result);
274*6777b538SAndroid Build Coastguard Worker }
275*6777b538SAndroid Build Coastguard Worker 
OnConnectComplete(CompletionOnceCallback callback,int result)276*6777b538SAndroid Build Coastguard Worker void FuzzedSocket::OnConnectComplete(CompletionOnceCallback callback,
277*6777b538SAndroid Build Coastguard Worker                                      int result) {
278*6777b538SAndroid Build Coastguard Worker   CHECK(connect_pending_);
279*6777b538SAndroid Build Coastguard Worker   connect_pending_ = false;
280*6777b538SAndroid Build Coastguard Worker   if (result < 0)
281*6777b538SAndroid Build Coastguard Worker     error_pending_ = false;
282*6777b538SAndroid Build Coastguard Worker   net_error_ = result;
283*6777b538SAndroid Build Coastguard Worker   std::move(callback).Run(result);
284*6777b538SAndroid Build Coastguard Worker }
285*6777b538SAndroid Build Coastguard Worker 
ForceSync() const286*6777b538SAndroid Build Coastguard Worker bool FuzzedSocket::ForceSync() const {
287*6777b538SAndroid Build Coastguard Worker   return (num_async_reads_and_writes_ >= kMaxAsyncReadsAndWrites);
288*6777b538SAndroid Build Coastguard Worker }
289*6777b538SAndroid Build Coastguard Worker 
290*6777b538SAndroid Build Coastguard Worker }  // namespace net
291