1 #include "resolv_fuzzer_utils.h"
2 
3 namespace android::net {
4 namespace {
5 
6 // Tests resolv_gethostbyaddr.
TestResolvGethostbyaddr(FuzzedDataProvider & fdp)7 void TestResolvGethostbyaddr(FuzzedDataProvider& fdp) {
8     in6_addr v6addr;
9     fdp.ConsumeBool() ? fdp.ConsumeData(&v6addr, sizeof(v6addr))    // Fuzzing data.
10                       : inet_pton(AF_INET6, "::1.2.3.4", &v6addr);  // Correct data.
11     // Fuzzs some values defined in nameser.h, e.g. NS_INADDRSZ.
12     socklen_t mAddressLen = fdp.ConsumeIntegralInRange<int>(0, NS_IN6ADDRSZ + 1);
13     // All valid address families in socket.h, e.g. AF_INET.
14     int af = fdp.ConsumeIntegralInRange<int>(0, AF_MAX);
15     hostent hbuf;
16     char tmpbuf[MAXPACKET];
17     hostent* hp;
18     NetworkDnsEventReported event;
19 
20     resolv_gethostbyaddr(&v6addr, mAddressLen, af, &hbuf, tmpbuf, sizeof(tmpbuf), &mNetContext, &hp,
21                          &event);
22 }
23 
24 }  // namespace
25 
26 // Entry point of fuzzing test.
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)27 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
28     [[maybe_unused]] static bool initialized = DoInit();
29     FuzzedDataProvider fdp(data, size);
30 
31     auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
32     // Chooses private DNS or not.
33     if (fdp.ConsumeBool()) parcel.tlsServers = {};
34     resolverCtrl.setResolverConfiguration(parcel);
35 
36     TestResolvGethostbyaddr(fdp);
37 
38     CleanUp();
39     return 0;
40 }
41 
42 }  // namespace android::net
43