1 #include <netdb.h>
2 #include <sys/param.h>
3 
4 #include <string>
5 
6 #include "resolv_fuzzer_utils.h"
7 
8 namespace android::net {
9 namespace {
10 
11 // Tests resolv_gethostbyname.
TestResolvGethostbyname(FuzzedDataProvider & fdp)12 void TestResolvGethostbyname(FuzzedDataProvider& fdp) {
13     std::string hostname = fdp.ConsumeRandomLengthString(MAXHOSTNAMELEN);
14     // All valid address families in socket.h, e.g. AF_INET.
15     int af = fdp.ConsumeIntegralInRange<int>(0, AF_MAX);
16     hostent hbuf;
17     char tmpbuf[MAXPACKET];
18     hostent* hp;
19     NetworkDnsEventReported event;
20 
21     resolv_gethostbyname(fdp.ConsumeBool() ? hostname.c_str() : nullptr, af, &hbuf, tmpbuf,
22                          sizeof(tmpbuf), &mNetContext, &hp, &event);
23 }
24 
25 }  // namespace
26 
27 // Entry point of fuzzing test.
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)28 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
29     [[maybe_unused]] static const bool initialized = DoInit();
30     FuzzedDataProvider fdp(data, size);
31 
32     auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
33     // Chooses private DNS or not.
34     if (fdp.ConsumeBool()) parcel.tlsServers = {};
35     resolverCtrl.setResolverConfiguration(parcel);
36 
37     TestResolvGethostbyname(fdp);
38 
39     CleanUp();
40     return 0;
41 }
42 
43 }  // namespace android::net
44