1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 
18 #include "resolv_fuzzer_utils.h"
19 
20 namespace android::net {
21 
22 // Initializes servers to simulate the DNS over UDP/TLS/HTTPS.
23 test::DNSResponder dns{kDefaultServer, kDnsPortString};
24 test::DohFrontend doh{kDefaultServer, kDohPortString, "127.0.1.3", kDnsPortString};
25 test::DNSResponder doh_backend{"127.0.1.3", kDnsPortString};
26 test::DnsTlsFrontend dot{kDefaultServer, kDotPortString, "127.0.2.3", kDnsPortString};
27 test::DNSResponder dot_backend{"127.0.2.3", kDnsPortString};
28 ResolverController resolverCtrl;
29 
30 // TODO: Consider moving to packages/modules/DnsResolver/tests/resolv_test_utils.h.
StartDns(test::DNSResponder & dns,const std::vector<DnsRecord> & records)31 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
32     for (const auto& r : records) {
33         dns.addMapping(r.host_name, r.type, r.addr);
34     }
35 
36     ASSERT_TRUE(dns.startServer());
37     dns.clearQueries();
38 }
39 
RandomSocketType(FuzzedDataProvider & fdp)40 int RandomSocketType(FuzzedDataProvider& fdp) {
41     int socktype = fdp.PickValueInArray(
42             {SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_RDM, SOCK_SEQPACKET, SOCK_DCCP, SOCK_PACKET});
43     if (fdp.ConsumeBool()) socktype |= SOCK_CLOEXEC;
44     if (fdp.ConsumeBool()) socktype |= SOCK_NONBLOCK;
45     return socktype;
46 }
47 
48 // Initializes the callback functions to createNetworkCache.
InitDnsResolverCallbacks()49 void InitDnsResolverCallbacks() {
50     gResNetdCallbacks.check_calling_permission = [](const char*) -> bool { return true; };
51     gResNetdCallbacks.get_network_context = [](uint32_t, uint32_t, android_net_context*) {};
52     gResNetdCallbacks.log = [](const char*) {};
53 }
54 
InitServers()55 void InitServers() {
56     StartDns(dns, records);
57     doh.startServer();
58     StartDns(doh_backend, records);
59     dot.startServer();
60     StartDns(dot_backend, records);
61 }
62 
CleanServers()63 void CleanServers() {
64     dns.clearQueries();
65     doh.clearQueries();
66     doh_backend.clearQueries();
67     dot.clearQueries();
68     dot_backend.clearQueries();
69 }
70 
71 // Initializes servers only one time.
DoInit()72 bool DoInit() {
73     // Sets log level to WARNING to lower I/O time cost.
74     resolv_set_log_severity(android::base::WARNING);
75     doh_init_logger(DOH_LOG_LEVEL_WARN);
76 
77     // Needs to init callback and create netework cache.
78     InitDnsResolverCallbacks();
79     resolverCtrl.createNetworkCache(TEST_NETID);
80     InitServers();
81 
82     return true;
83 }
84 
CleanUp()85 void CleanUp() {
86     CleanServers();
87     resolverCtrl.flushNetworkCache(TEST_NETID);
88 }
89 
90 }  // namespace android::net
91