Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c5c34f3 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 9333799 from d0e5523c to mainline-tethering-release

Change-Id: I175a087707d20807a326339e4657fb68af81e2f8
parents 58bb240b d0e5523c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -340,6 +340,7 @@ cc_defaults {
    ],
    srcs: [
        "doh_frontend.cpp",
        "fuzzer/resolv_fuzzer_utils.cpp",
    ],
    header_libs: [
        "libnetd_resolv_headers",
+90 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

#include "resolv_fuzzer_utils.h"

namespace android::net {

// Initializes servers to simulate the DNS over UDP/TLS/HTTPS.
test::DNSResponder dns{kDefaultServer, kDnsPortString};
test::DohFrontend doh{kDefaultServer, kDohPortString, "127.0.1.3", kDnsPortString};
test::DNSResponder doh_backend{"127.0.1.3", kDnsPortString};
test::DnsTlsFrontend dot{kDefaultServer, kDotPortString, "127.0.2.3", kDnsPortString};
test::DNSResponder dot_backend{"127.0.2.3", kDnsPortString};
ResolverController resolverCtrl;

// TODO: Consider moving to packages/modules/DnsResolver/tests/resolv_test_utils.h.
void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
    for (const auto& r : records) {
        dns.addMapping(r.host_name, r.type, r.addr);
    }

    ASSERT_TRUE(dns.startServer());
    dns.clearQueries();
}

int RandomSocketType(FuzzedDataProvider& fdp) {
    int socktype = fdp.PickValueInArray(
            {SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_RDM, SOCK_SEQPACKET, SOCK_DCCP, SOCK_PACKET});
    if (fdp.ConsumeBool()) socktype |= SOCK_CLOEXEC;
    if (fdp.ConsumeBool()) socktype |= SOCK_NONBLOCK;
    return socktype;
}

// Initializes the callback functions to createNetworkCache.
void InitDnsResolverCallbacks() {
    gResNetdCallbacks.check_calling_permission = [](const char*) -> bool { return true; };
    gResNetdCallbacks.get_network_context = [](uint32_t, uint32_t, android_net_context*) {};
    gResNetdCallbacks.log = [](const char*) {};
}

void InitServers() {
    StartDns(dns, records);
    doh.startServer();
    StartDns(doh_backend, records);
    dot.startServer();
    StartDns(dot_backend, records);
}

void CleanServers() {
    dns.clearQueries();
    doh.clearQueries();
    doh_backend.clearQueries();
    dot.clearQueries();
    dot_backend.clearQueries();
}

// Initializes servers only one time.
bool DoInit() {
    // Sets log level to WARNING to lower I/O time cost.
    resolv_set_log_severity(android::base::WARNING);
    doh_init_logger(DOH_LOG_LEVEL_WARN);

    // Needs to init callback and create netework cache.
    InitDnsResolverCallbacks();
    resolverCtrl.createNetworkCache(TEST_NETID);
    InitServers();

    return true;
}

void CleanUp() {
    CleanServers();
    resolverCtrl.flushNetworkCache(TEST_NETID);
}

}  // namespace android::net
 No newline at end of file
+10 −67
Original line number Diff line number Diff line
@@ -39,73 +39,16 @@ const android_net_context mNetContext = {
        .uid = TEST_UID,
};

// Initializes servers to simulate the DNS over UDP/TLS/HTTPS.
test::DNSResponder dns{kDefaultServer, kDnsPortString};
test::DohFrontend doh{kDefaultServer, kDohPortString, "127.0.1.3", kDnsPortString};
test::DNSResponder doh_backend{"127.0.1.3", kDnsPortString};
test::DnsTlsFrontend dot{kDefaultServer, kDotPortString, "127.0.2.3", kDnsPortString};
test::DNSResponder dot_backend{"127.0.2.3", kDnsPortString};
ResolverController resolverCtrl;

// TODO: Consider moving to packages/modules/DnsResolver/tests/resolv_test_utils.h.
void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
    for (const auto& r : records) {
        dns.addMapping(r.host_name, r.type, r.addr);
    }

    ASSERT_TRUE(dns.startServer());
    dns.clearQueries();
}

int RandomSocketType(FuzzedDataProvider& fdp) {
    int socktype = fdp.PickValueInArray(
            {SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_RDM, SOCK_SEQPACKET, SOCK_DCCP, SOCK_PACKET});
    if (fdp.ConsumeBool()) socktype |= SOCK_CLOEXEC;
    if (fdp.ConsumeBool()) socktype |= SOCK_NONBLOCK;
    return socktype;
}

// Initializes the callback functions to createNetworkCache.
void InitDnsResolverCallbacks() {
    gResNetdCallbacks.check_calling_permission = [](const char*) -> bool { return true; };
    gResNetdCallbacks.get_network_context = [](uint32_t, uint32_t, android_net_context*) {};
    gResNetdCallbacks.log = [](const char*) {};
}

void InitServers() {
    StartDns(dns, records);
    doh.startServer();
    StartDns(doh_backend, records);
    dot.startServer();
    StartDns(dot_backend, records);
}

void CleanServers() {
    dns.clearQueries();
    doh.clearQueries();
    doh_backend.clearQueries();
    dot.clearQueries();
    dot_backend.clearQueries();
}

// Initializes servers only one time.
bool DoInit() {
    // Sets log level to WARNING to lower I/O time cost.
    resolv_set_log_severity(android::base::WARNING);
    doh_init_logger(DOH_LOG_LEVEL_WARN);

    // Needs to init callback and create netework cache.
    InitDnsResolverCallbacks();
    resolverCtrl.createNetworkCache(TEST_NETID);
    InitServers();

    return true;
}

void CleanUp() {
    CleanServers();
    resolverCtrl.flushNetworkCache(TEST_NETID);
}
extern test::DnsTlsFrontend dot;
extern ResolverController resolverCtrl;

void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
int RandomSocketType(FuzzedDataProvider& fdp);
void InitDnsResolverCallbacks();
void InitServers();
void CleanServers();
bool DoInit();
void CleanUp();

}  // namespace android::net

+65 −0
Original line number Diff line number Diff line
@@ -1643,6 +1643,67 @@ TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
    EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
}

TEST_F(ResolverTest, GetAddrInfoV4V6FromCustTable_MultiAnswers) {
    test::DNSResponder dns;
    StartDns(dns, {});

    auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
    ResolverOptionsParcel resolverOptions;
    resolverOptions.hosts = {
            {kHelloExampleComAddrV4, kHelloExampleCom},
            {kHelloExampleComAddrV6_GUA, kHelloExampleCom},
            {kHelloExampleComAddrV6_IPV4COMPAT, kHelloExampleCom},
            {kHelloExampleComAddrV6_TEREDO, kHelloExampleCom},
    };
    if (!mIsResolverOptionIPCSupported) {
        resolverParams.resolverOptions = resolverOptions;
    }
    ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());

    if (mIsResolverOptionIPCSupported) {
        ASSERT_TRUE(mDnsClient.resolvService()
                            ->setResolverOptions(resolverParams.netId, resolverOptions)
                            .isOk());
    }

    addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
    ScopedAddrinfo result = safe_getaddrinfo(kHelloExampleCom, nullptr, &hints);
    ASSERT_TRUE(result != nullptr);
    // Expect the order is the same as the order of record insertion because the custom table uses
    // std::multimap to store and the queried results are not sorted by RFC 6724.
    // See getCustomHosts in packages/modules/DnsResolver/getaddrinfo.cpp
    EXPECT_THAT(ToStrings(result),
                testing::ElementsAreArray({kHelloExampleComAddrV4, kHelloExampleComAddrV6_GUA,
                                           kHelloExampleComAddrV6_IPV4COMPAT,
                                           kHelloExampleComAddrV6_TEREDO}));
    EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));

    hints = {.ai_family = AF_UNSPEC};
    result = safe_getaddrinfo(kHelloExampleCom, nullptr, &hints);
    ASSERT_TRUE(result != nullptr);
    // The overall result is the concatenation of each result from explore_fqdn().
    // resolv_getaddrinfo() calls explore_fqdn() many times by the different explore_options.
    // It means that the results of each explore_options keep the order and concatenates
    // all results into one link list. The address order of the output addrinfo is:
    //   1.2.3.4 (socktype=2, protocol=17) ->
    //   2404:6800::5175:15ca (socktype=2, protocol=17) ->
    //   ::1.2.3.4 (socktype=2, protocol=17) ->
    //   2001::47c1 (socktype=2, protocol=17) ->
    //   1.2.3.4 (socktype=1, protocol=6) ->
    //   2404:6800::5175:15ca (socktype=1, protocol=6) ->
    //   ::1.2.3.4 (socktype=1, protocol=6) ->
    //   2001::47c1 (socktype=1, protocol=6)
    //
    // See resolv_getaddrinfo, explore_fqdn and dns_getaddrinfo.
    EXPECT_THAT(ToStrings(result),
                testing::ElementsAreArray(
                        {kHelloExampleComAddrV4, kHelloExampleComAddrV6_GUA,
                         kHelloExampleComAddrV6_IPV4COMPAT, kHelloExampleComAddrV6_TEREDO,
                         kHelloExampleComAddrV4, kHelloExampleComAddrV6_GUA,
                         kHelloExampleComAddrV6_IPV4COMPAT, kHelloExampleComAddrV6_TEREDO}));
    EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
}

TEST_F(ResolverTest, EmptySetup) {
    ASSERT_TRUE(mDnsClient.SetResolversFromParcel(ResolverParamsParcel{.netId = TEST_NETID}));
    const auto resolvInfo = mDnsClient.getResolverInfo();
@@ -7669,6 +7730,10 @@ TEST_F(ResolverMultinetworkTest, IPv6LinkLocalWithDefaultRoute) {
// Test if the "do not send AAAA query when IPv6 address is link-local with a default route" feature
// can be toggled by flag.
TEST_F(ResolverMultinetworkTest, IPv6LinkLocalWithDefaultRouteFlag) {
    // Kernel 4.4 does not provide an IPv6 link-local address when an interface is added to a
    // network. Skip it because v6 link-local address is a prerequisite for this test.
    SKIP_IF_KERNEL_VERSION_LOWER_THAN(4, 9, 0);

    constexpr char host_name[] = "ohayou.example.com.";
    const struct TestConfig {
        std::string flagValue;