mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-18 12:54:17 +00:00
b7271572bc
None of the values in nsIDNSSerrvice::DNSFlags that are greater than 1 << 15 currently have any impact on the behaviour of GetAddrInfo, but if we wanted to define others, those bits might get truncated. It is better just to keep the same type all though the function call pipeline. Depends on D212109 Differential Revision: https://phabricator.services.mozilla.com/D224931
98 lines
2.7 KiB
C++
98 lines
2.7 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim:set ts=4 sw=2 sts=2 et cin: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "GetAddrInfo.h"
|
|
#include "mozilla/glean/GleanMetrics.h"
|
|
#include "mozilla/net/DNSPacket.h"
|
|
#include "nsIDNSService.h"
|
|
#include "mozilla/Maybe.h"
|
|
#include "mozilla/StaticPrefs_network.h"
|
|
#include "mozilla/ThreadLocal.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <netinet/in.h>
|
|
#include <resolv.h>
|
|
|
|
namespace mozilla::net {
|
|
|
|
#if defined(HAVE_RES_NINIT)
|
|
MOZ_THREAD_LOCAL(struct __res_state*) sThreadRes;
|
|
#endif
|
|
|
|
#define LOG(msg, ...) \
|
|
MOZ_LOG(gGetAddrInfoLog, LogLevel::Debug, ("[DNS]: " msg, ##__VA_ARGS__))
|
|
|
|
nsresult ResolveHTTPSRecordImpl(const nsACString& aHost,
|
|
nsIDNSService::DNSFlags aFlags,
|
|
TypeRecordResultType& aResult, uint32_t& aTTL) {
|
|
DNSPacket packet;
|
|
nsAutoCString host(aHost);
|
|
nsAutoCString cname;
|
|
nsresult rv;
|
|
|
|
if (xpc::IsInAutomation() &&
|
|
!StaticPrefs::network_dns_native_https_query_in_automation()) {
|
|
return NS_ERROR_UNKNOWN_HOST;
|
|
}
|
|
|
|
#if defined(HAVE_RES_NINIT)
|
|
if (!sThreadRes.get()) {
|
|
UniquePtr<struct __res_state> resState(new struct __res_state);
|
|
memset(resState.get(), 0, sizeof(struct __res_state));
|
|
if (int ret = res_ninit(resState.get())) {
|
|
LOG("res_ninit failed: %d", ret);
|
|
return NS_ERROR_UNKNOWN_HOST;
|
|
}
|
|
sThreadRes.set(resState.release());
|
|
}
|
|
#endif
|
|
|
|
LOG("resolving %s\n", host.get());
|
|
// Perform the query
|
|
rv = packet.FillBuffer(
|
|
[&](unsigned char response[DNSPacket::MAX_SIZE]) -> int {
|
|
int len = 0;
|
|
TimeStamp startTime = TimeStamp::Now();
|
|
#if defined(HAVE_RES_NINIT)
|
|
len = res_nquery(sThreadRes.get(), host.get(), ns_c_in,
|
|
nsIDNSService::RESOLVE_TYPE_HTTPSSVC, response,
|
|
DNSPacket::MAX_SIZE);
|
|
#else
|
|
len =
|
|
res_query(host.get(), ns_c_in, nsIDNSService::RESOLVE_TYPE_HTTPSSVC,
|
|
response, DNSPacket::MAX_SIZE);
|
|
#endif
|
|
|
|
mozilla::glean::networking::dns_native_https_call_time
|
|
.AccumulateRawDuration(TimeStamp::Now() - startTime);
|
|
if (len < 0) {
|
|
LOG("DNS query failed");
|
|
}
|
|
return len;
|
|
});
|
|
if (NS_FAILED(rv)) {
|
|
return rv;
|
|
}
|
|
|
|
return ParseHTTPSRecord(host, packet, aResult, aTTL);
|
|
}
|
|
|
|
void DNSThreadShutdown() {
|
|
#if defined(HAVE_RES_NINIT)
|
|
auto* res = sThreadRes.get();
|
|
if (!res) {
|
|
return;
|
|
}
|
|
|
|
sThreadRes.set(nullptr);
|
|
res_nclose(res);
|
|
#endif
|
|
}
|
|
|
|
} // namespace mozilla::net
|