1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 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 #ifndef NET_SOCKET_FUZZED_SERVER_SOCKET_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_FUZZED_SERVER_SOCKET_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <memory> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 14*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 15*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_endpoint.h" 16*6777b538SAndroid Build Coastguard Worker #include "net/socket/server_socket.h" 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker class FuzzedDataProvider; 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace net { 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker class NetLog; 23*6777b538SAndroid Build Coastguard Worker class StreamSocket; 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker // A ServerSocket that uses a FuzzedDataProvider to generate the input the 26*6777b538SAndroid Build Coastguard Worker // server receives. It succeeds in Accept()ing, asynchronously, a single 27*6777b538SAndroid Build Coastguard Worker // connection with that input; later calls to Accept will just return 28*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING but will not invoke the callback. 29*6777b538SAndroid Build Coastguard Worker class FuzzedServerSocket : public ServerSocket { 30*6777b538SAndroid Build Coastguard Worker public: 31*6777b538SAndroid Build Coastguard Worker // |data_provider| is used as to determine behavior of the socket. It 32*6777b538SAndroid Build Coastguard Worker // must remain valid until after both this object and the StreamSocket 33*6777b538SAndroid Build Coastguard Worker // produced by Accept are destroyed. 34*6777b538SAndroid Build Coastguard Worker FuzzedServerSocket(FuzzedDataProvider* data_provider, net::NetLog* net_log); 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker FuzzedServerSocket(const FuzzedServerSocket&) = delete; 37*6777b538SAndroid Build Coastguard Worker FuzzedServerSocket& operator=(const FuzzedServerSocket&) = delete; 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker ~FuzzedServerSocket() override; 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker int Listen(const IPEndPoint& address, 42*6777b538SAndroid Build Coastguard Worker int backlog, 43*6777b538SAndroid Build Coastguard Worker std::optional<bool> ipv6_only) override; 44*6777b538SAndroid Build Coastguard Worker int GetLocalAddress(IPEndPoint* address) const override; 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker int Accept(std::unique_ptr<StreamSocket>* socket, 47*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker private: 50*6777b538SAndroid Build Coastguard Worker void DispatchAccept(std::unique_ptr<StreamSocket>* socket, 51*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback); 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker raw_ptr<FuzzedDataProvider> data_provider_; 54*6777b538SAndroid Build Coastguard Worker raw_ptr<net::NetLog> net_log_; 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker IPEndPoint listening_on_; 57*6777b538SAndroid Build Coastguard Worker bool first_accept_ = true; 58*6777b538SAndroid Build Coastguard Worker bool listen_called_ = false; 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<FuzzedServerSocket> weak_factory_{this}; 61*6777b538SAndroid Build Coastguard Worker }; 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker } // namespace net 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker #endif // NET_SOCKET_FUZZED_SERVER_SOCKET_H_ 66