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