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

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

Snap for 8917908 from 096c2d81 to mainline-ipsec-release

Change-Id: I4aa892238fe85c5296f5caac88d7156f42149c74
parents 774e9fd4 096c2d81
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -300,13 +300,6 @@ cc_library_static {
    min_sdk_version: "29",
}

filegroup {
    name: "resolv_rust_test_config_template",
    srcs: [
        "resolv_rust_test_config_template.xml",
    ],
}

filegroup {
    name: "resolv_test_config_template",
    srcs: [
@@ -366,9 +359,6 @@ rust_test {
    edition: "2018",
    test_suites: ["general-tests"],
    auto_gen_config: true,
    // Used to enable root permission for the test.
    // TODO: remove after 'require_root' is supported in rust_test.
    test_config_template: ":resolv_rust_test_config_template",
    rustlibs: doh_rust_deps + ["libquiche_static"],
    min_sdk_version: "29",
}
+71 −57
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@

#include <arpa/inet.h>
#include <dirent.h>
#include <errno.h>
#include <linux/if.h>
#include <math.h>
#include <net/if.h>
@@ -34,6 +33,7 @@
#include <algorithm>
#include <vector>

#include <android-base/parseint.h>
#include <android/multinetwork.h>  // ResNsendFlags
#include <cutils/misc.h>           // FIRST_APPLICATION_UID
#include <cutils/multiuser.h>
@@ -63,6 +63,8 @@
using aidl::android::net::metrics::INetdEventListener;
using aidl::android::net::resolv::aidl::DnsHealthEventParcel;
using aidl::android::net::resolv::aidl::IDnsResolverUnsolicitedEventListener;
using android::base::ParseInt;
using android::base::ParseUint;
using std::span;

namespace android {
@@ -235,23 +237,9 @@ int resNSendToAiError(int err, int rcode) {
    return EAI_SYSTEM;
}

template <typename IntegralType>
bool simpleStrtoul(const char* input, IntegralType* output, int base = 10) {
    char* endPtr;
    errno = 0;
    auto result = strtoul(input, &endPtr, base);
    // Check the length in order to ensure there is no "-" sign
    if (!*input || *endPtr || (endPtr - input) != static_cast<ptrdiff_t>(strlen(input)) ||
        (errno == ERANGE && (result == ULONG_MAX))) {
        return false;
    }
    *output = result;
    return true;
}

bool setQueryId(span<uint8_t> msg, uint16_t query_id) {
    if ((size_t)msg.size() < sizeof(HEADER)) {
        errno = EINVAL;
        LOG(ERROR) << __func__ << ": Invalid parameter";
        return false;
    }
    auto hp = reinterpret_cast<HEADER*>(msg.data());
@@ -703,6 +691,17 @@ static bool evaluate_domain_name(const android_net_context& netcontext, const ch
    return gResNetdCallbacks.evaluate_domain_name(netcontext, host);
}

static int HandleArgumentError(SocketClient* cli, int errorcode, std::string strerrormessage,
                               int argc, char** argv) {
    for (int i = 0; i < argc; i++) {
        strerrormessage += "argv[" + std::to_string(i) + "]=" + (argv[i] ? argv[i] : "null") + " ";
    }

    LOG(WARNING) << strerrormessage;
    cli->sendMsg(errorcode, strerrormessage.c_str(), false);
    return -1;
}

static bool sendBE32(SocketClient* c, uint32_t data) {
    uint32_t be_data = htonl(data);
    return c->sendData(&be_data, sizeof(be_data)) == 0;
@@ -911,22 +910,31 @@ DnsProxyListener::GetAddrInfoCmd::GetAddrInfoCmd() : FrameworkCommand("getaddrin
int DnsProxyListener::GetAddrInfoCmd::runCommand(SocketClient* cli, int argc, char** argv) {
    logArguments(argc, argv);

    int ai_flags = 0;
    int ai_family = 0;
    int ai_socktype = 0;
    int ai_protocol = 0;
    unsigned netId = 0;
    std::string strErr = "GetAddrInfoCmd::runCommand: ";

    if (argc != 8) {
        char* msg = nullptr;
        asprintf(&msg, "Invalid number of arguments to getaddrinfo: %i", argc);
        LOG(WARNING) << "GetAddrInfoCmd::runCommand: " << (msg ? msg : "null");
        cli->sendMsg(ResponseCode::CommandParameterError, msg, false);
        free(msg);
        return -1;
        strErr = strErr + "invalid number of arguments: " + std::to_string(argc);
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, 0, NULL);
    }

    const std::string name = argv[1];
    const std::string service = argv[2];
    int ai_flags = strtol(argv[3], nullptr, 10);
    int ai_family = strtol(argv[4], nullptr, 10);
    int ai_socktype = strtol(argv[5], nullptr, 10);
    int ai_protocol = strtol(argv[6], nullptr, 10);
    unsigned netId = strtoul(argv[7], nullptr, 10);
    if (!ParseInt(argv[3], &ai_flags))
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, argc, argv);
    if (!ParseInt(argv[4], &ai_family))
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, argc, argv);
    if (!ParseInt(argv[5], &ai_socktype))
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, argc, argv);
    if (!ParseInt(argv[6], &ai_protocol))
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, argc, argv);
    if (!ParseUint(argv[7], &netId))
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, argc, argv);

    const bool useLocalNameservers = checkAndClearUseLocalNameserversFlag(&netId);
    const uid_t uid = cli->getUid();

@@ -967,7 +975,7 @@ int DnsProxyListener::ResNSendCommand::runCommand(SocketClient* cli, int argc, c
    }

    unsigned netId;
    if (!simpleStrtoul(argv[1], &netId)) {
    if (!ParseUint(argv[1], &netId)) {
        LOG(WARNING) << "ResNSendCommand::runCommand: resnsend: from UID " << uid
                     << ", invalid netId";
        sendBE32(cli, -EINVAL);
@@ -975,7 +983,7 @@ int DnsProxyListener::ResNSendCommand::runCommand(SocketClient* cli, int argc, c
    }

    uint32_t flags;
    if (!simpleStrtoul(argv[2], &flags)) {
    if (!ParseUint(argv[2], &flags)) {
        LOG(WARNING) << "ResNSendCommand::runCommand: resnsend: from UID " << uid
                     << ", invalid flags";
        sendBE32(cli, -EINVAL);
@@ -1077,9 +1085,14 @@ void DnsProxyListener::ResNSendHandler::run() {
        return;
    }

    // Restore query id and send answer
    if (!setQueryId({ansBuf.data(), ansLen}, original_query_id) ||
        !sendLenAndData(mClient, ansLen, ansBuf.data())) {
    // Restore query id
    if (!setQueryId({ansBuf.data(), ansLen}, original_query_id)) {
        LOG(WARNING) << "ResNSendHandler::run: resnsend: failed to restore query id";
        return;
    }

    // Send answer
    if (!sendLenAndData(mClient, ansLen, ansBuf.data())) {
        PLOG(WARNING) << "ResNSendHandler::run: resnsend: failed to send answer to uid " << uid
                      << " pid " << mClient->getPid();
        return;
@@ -1124,7 +1137,7 @@ int DnsProxyListener::GetDnsNetIdCommand::runCommand(SocketClient* cli, int argc
    }

    unsigned netId;
    if (!simpleStrtoul(argv[1], &netId)) {
    if (!ParseUint(argv[1], &netId)) {
        LOG(WARNING) << "GetDnsNetIdCommand::runCommand: getdnsnetid: from UID " << uid
                     << ", invalid netId";
        sendCodeAndBe32(cli, ResponseCode::DnsProxyQueryResult, -EINVAL);
@@ -1158,20 +1171,22 @@ DnsProxyListener::GetHostByNameCmd::GetHostByNameCmd() : FrameworkCommand("getho
int DnsProxyListener::GetHostByNameCmd::runCommand(SocketClient* cli, int argc, char** argv) {
    logArguments(argc, argv);

    unsigned netId = 0;
    int af = 0;
    std::string strErr = "GetHostByNameCmd::runCommand: ";

    if (argc != 4) {
        char* msg = nullptr;
        asprintf(&msg, "Invalid number of arguments to gethostbyname: %i", argc);
        LOG(WARNING) << "GetHostByNameCmd::runCommand: " << (msg ? msg : "null");
        cli->sendMsg(ResponseCode::CommandParameterError, msg, false);
        free(msg);
        return -1;
        strErr = strErr + "invalid number of arguments: " + std::to_string(argc);
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, 0, NULL);
    }

    if (!ParseUint(argv[1], &netId))
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, argc, argv);
    std::string name = argv[2];
    if (!ParseInt(argv[3], &af))
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, argc, argv);
    uid_t uid = cli->getUid();
    unsigned netId = strtoul(argv[1], nullptr, 10);
    const bool useLocalNameservers = checkAndClearUseLocalNameserversFlag(&netId);
    std::string name = argv[2];
    int af = strtol(argv[3], nullptr, 10);

    android_net_context netcontext;
    gResNetdCallbacks.get_network_context(netId, uid, &netcontext);
@@ -1292,33 +1307,32 @@ DnsProxyListener::GetHostByAddrCmd::GetHostByAddrCmd() : FrameworkCommand("getho

int DnsProxyListener::GetHostByAddrCmd::runCommand(SocketClient* cli, int argc, char** argv) {
    logArguments(argc, argv);
    int addrLen = 0;
    int addrFamily = 0;
    unsigned netId = 0;
    std::string strErr = "GetHostByAddrCmd::runCommand: ";

    if (argc != 5) {
        char* msg = nullptr;
        asprintf(&msg, "Invalid number of arguments to gethostbyaddr: %i", argc);
        LOG(WARNING) << "GetHostByAddrCmd::runCommand: " << (msg ? msg : "null");
        cli->sendMsg(ResponseCode::CommandParameterError, msg, false);
        free(msg);
        return -1;
        strErr = strErr + "invalid number of arguments: " + std::to_string(argc);
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, 0, NULL);
    }

    char* addrStr = argv[1];
    int addrLen = strtol(argv[2], nullptr, 10);
    int addrFamily = strtol(argv[3], nullptr, 10);
    if (!ParseInt(argv[2], &addrLen))
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, argc, argv);
    if (!ParseInt(argv[3], &addrFamily))
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, argc, argv);
    if (!ParseUint(argv[4], &netId))
        return HandleArgumentError(cli, ResponseCode::CommandParameterError, strErr, argc, argv);
    uid_t uid = cli->getUid();
    unsigned netId = strtoul(argv[4], nullptr, 10);
    const bool useLocalNameservers = checkAndClearUseLocalNameserversFlag(&netId);

    in6_addr addr;
    errno = 0;
    int result = inet_pton(addrFamily, addrStr, &addr);
    if (result <= 0) {
        char* msg = nullptr;
        asprintf(&msg, "inet_pton(\"%s\") failed %s", addrStr, strerror(errno));
        LOG(WARNING) << "GetHostByAddrCmd::runCommand: " << (msg ? msg : "null");
        cli->sendMsg(ResponseCode::OperationFailed, msg, false);
        free(msg);
        return -1;
        strErr = strErr + "inet_pton(\"" + addrStr + "\") failed " + strerror(errno);
        return HandleArgumentError(cli, ResponseCode::OperationFailed, strErr, 0, NULL);
    }

    android_net_context netcontext;
+2 −2
Original line number Diff line number Diff line
@@ -20,9 +20,9 @@
#include <android-base/strings.h>
#include <android-base/test_utils.h>
#include <gtest/gtest.h>
#include <netdutils/NetNativeTestBase.h>

#include "DnsQueryLog.h"
#include "tests/resolv_test_base.h"

using namespace std::chrono_literals;

@@ -59,7 +59,7 @@ void verifyDumpOutput(const std::string& dumpLog, const std::vector<int>& expect

}  // namespace

class DnsQueryLogTest : public ResolvTestBase {
class DnsQueryLogTest : public NetNativeTestBase {
  protected:
    const std::vector<std::string> serversV4 = {"127.0.0.1", "1.2.3.4"};
    const std::vector<std::string> serversV4V6 = {"127.0.0.1", "1.2.3.4", "2001:db8::1",
+3 −3
Original line number Diff line number Diff line
@@ -19,9 +19,9 @@
#include <android-base/test_utils.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <netdutils/NetNativeTestBase.h>

#include "DnsStats.h"
#include "tests/resolv_test_base.h"

namespace android::net {

@@ -67,7 +67,7 @@ StatsData makeStatsData(const IPSockAddr& server, const int total, const microse

// TODO: add StatsDataTest to ensure its methods return correct outputs.

class StatsRecordsTest : public ResolvTestBase {};
class StatsRecordsTest : public NetNativeTestBase {};

TEST_F(StatsRecordsTest, PushRecord) {
    const IPSockAddr server = IPSockAddr::toIPSockAddr("127.0.0.2", 53);
@@ -105,7 +105,7 @@ TEST_F(StatsRecordsTest, PushRecord) {
              makeStatsData(server, 3, 750ms, {{NS_R_NO_ERROR, 0}, {NS_R_TIMEOUT, 3}}));
}

class DnsStatsTest : public ResolvTestBase {
class DnsStatsTest : public NetNativeTestBase {
  protected:
    std::string captureDumpOutput() {
        netdutils::DumpWriter dw(STDOUT_FILENO);
+1 −1
Original line number Diff line number Diff line
@@ -229,7 +229,7 @@ DnsTlsTransport::Response DnsTlsDispatcher::query(const DnsTlsServer& server, un
            // happens, the xport will be marked as unusable and DoT queries won't be sent to
            // it anymore. Eventually, after IDLE_TIMEOUT, the xport will be destroyed, and
            // a new xport will be created.
            const auto result = PrivateDnsConfiguration::getInstance().requestValidation(
            const auto result = PrivateDnsConfiguration::getInstance().requestDotValidation(
                    netId, PrivateDnsConfiguration::ServerIdentity{server}, mark);
            LOG(WARNING) << "Requested validation for " << server.toIpString() << " with mark 0x"
                         << std::hex << mark << ", "
Loading