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

Commit d2d18ea8 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 5987274 from 7f433bed to rvc-release

Change-Id: I58c7108999803e8151a58535c54850fb4c83ef74
parents 5909338a 7f433bed
Loading
Loading
Loading
Loading
+25 −5
Original line number Diff line number Diff line
@@ -535,6 +535,13 @@ DnsProxyListener::GetAddrInfoHandler::~GetAddrInfoHandler() {
    free(mHints);
}

static bool evaluate_domain_name(const android_net_context &netcontext,
                                 const char *host) {
    if (!gResNetdCallbacks.evaluate_domain_name)
        return true;
    return gResNetdCallbacks.evaluate_domain_name(netcontext, host);
}

static bool sendBE32(SocketClient* c, uint32_t data) {
    uint32_t be_data = htonl(data);
    return c->sendData(&be_data, sizeof(be_data)) == 0;
@@ -672,7 +679,12 @@ void DnsProxyListener::GetAddrInfoHandler::run() {
    NetworkDnsEventReported event;
    initDnsEvent(&event);
    if (queryLimiter.start(uid)) {
        rv = resolv_getaddrinfo(mHost, mService, mHints, &mNetContext, &result, &event);
        if (evaluate_domain_name(mNetContext, mHost)) {
            rv = resolv_getaddrinfo(mHost, mService, mHints, &mNetContext, &result,
                                    &event);
        } else {
            rv = EAI_SYSTEM;
        }
        queryLimiter.finish(uid);
    } else {
        // Note that this error code is currently not passed down to the client.
@@ -887,8 +899,12 @@ void DnsProxyListener::ResNSendHandler::run() {
    NetworkDnsEventReported event;
    initDnsEvent(&event);
    if (queryLimiter.start(uid)) {
        if (evaluate_domain_name(mNetContext, rr_name.c_str())) {
            nsendAns = resolv_res_nsend(&mNetContext, msg.data(), msgLen, ansBuf.data(), MAXPACKET,
                                        &rcode, static_cast<ResNsendFlags>(mFlags), &event);
        } else {
            nsendAns = -EAI_SYSTEM;
        }
        queryLimiter.finish(uid);
    } else {
        LOG(WARNING) << "ResNSendHandler::run: resnsend: from UID " << uid
@@ -1080,8 +1096,12 @@ void DnsProxyListener::GetHostByNameHandler::run() {
    NetworkDnsEventReported event;
    initDnsEvent(&event);
    if (queryLimiter.start(uid)) {
        if (evaluate_domain_name(mNetContext, mName)) {
            rv = resolv_gethostbyname(mName, mAf, &hbuf, tmpbuf, sizeof tmpbuf, &mNetContext, &hp,
                                      &event);
        } else {
            rv = EAI_SYSTEM;
        }
        queryLimiter.finish(uid);
    } else {
        rv = EAI_MEMORY;
+1 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ bool resolv_init(const ResolverNetdCallbacks* callbacks) {
    gResNetdCallbacks.log = callbacks->log;
    if (gApiLevel >= 30) {
        gResNetdCallbacks.tagSocket = callbacks->tagSocket;
        gResNetdCallbacks.evaluate_domain_name = callbacks->evaluate_domain_name;
    }
    android::net::gDnsResolv = android::net::DnsResolver::getInstance();
    return android::net::gDnsResolv->start();
+24 −0
Original line number Diff line number Diff line
@@ -81,6 +81,29 @@ typedef void (*get_network_context_callback)(unsigned netid, uid_t uid,
typedef void (*log_callback)(const char* msg);
typedef int (*tagSocketCallback)(int sockFd, uint32_t tag, uid_t uid, pid_t pid);

// The DnsResolver module invokes this callback once before starting each DNS
// lookup. The callback receives the android_net_context associated with the
// request, and the (possibly unqualified) hostname requested by the app via
// getaddrinfo() or gethostbyname().
//
// If the callback returns false, the DnsResolver will abort the request
// returning EAI_SYSTEM. If the callback returns true, the query will proceed as
// usual.
//
// If this callback is not present (i.e. set to nullptr), the effect is the same
// of returning true.
//
// This callback *will* be invoked concurrently from multiple threads. It must
// peform its own locking when accessing shared data structures. Furthermore,
// the callback must not sleep nor perform RPC requests.
//
// Be mindful that hostnames could contain sensitive user data. Do not log them
// and do not transmit them to third parties without explicit user
// authorization.
//
typedef bool (*evaluate_domain_name_callback)(
    const android_net_context &netcontext, const char *host);

/*
 * Some functions needed by the resolver (e.g. checkCallingPermission()) live in
 * libraries with no ABI stability guarantees, such as libbinder.so.
@@ -92,6 +115,7 @@ struct ResolverNetdCallbacks {
    get_network_context_callback get_network_context;
    log_callback log;
    tagSocketCallback tagSocket;
    evaluate_domain_name_callback evaluate_domain_name;
};

#define TAG_SYSTEM_DNS 0xFFFFFF82
+5 −0
Original line number Diff line number Diff line
@@ -215,6 +215,11 @@ class ResolvCacheTest : public ::testing::Test {
        EXPECT_TRUE(params == expected.setup.params) << msg;

        // res_stats checking.
        if (expected.stats.size() == 0) {
            for (int ns = 0; ns < nscount; ns++) {
                EXPECT_EQ(0U, stats[ns].sample_count) << msg;
            }
        }
        for (size_t i = 0; i < expected.stats.size(); i++) {
            EXPECT_TRUE(stats[i] == expected.stats[i]) << msg;
        }