return rcode;
}
- rcode = directResolve(target, qtype, QClass::IN, resolved, t_pdl); // XXX correct to use t_pdl?
+ rcode = directResolve(target, qtype, QClass::IN, resolved, t_pdl);
for (DNSRecord& rr : resolved) {
ret.push_back(std::move(rr));
again, possibly encountering the same CNAME(s), and we don't want to trigger the CNAME
loop detection. */
vector<DNSRecord> newRecords;
- int rcode = directResolve(qname, QType::A, QClass::IN, newRecords, t_pdl); // XXX correct to use t_pdl?
+ int rcode = directResolve(qname, QType::A, QClass::IN, newRecords, t_pdl);
ret.reserve(ret.size() + newRecords.size());
for (auto& record : newRecords) {
rr.d_content = std::make_shared<CNAMERecordContent>(newquery);
ret.push_back(rr);
- int rcode = directResolve(DNSName(newquery), QType::PTR, QClass::IN, ret, t_pdl); // XXX correct to use t_pdl?
+ int rcode = directResolve(DNSName(newquery), QType::PTR, QClass::IN, ret, t_pdl);
g_stats.dns64prefixanswers++;
return rcode;
sr.setId(MT->getTid());
bool DNSSECOK = false;
- if (t_pdl) {
- sr.setLuaEngine(t_pdl);
+ if (dc->d_luaContext) {
+ sr.setLuaEngine(dc->d_luaContext);
}
if (g_dnssecmode != DNSSECMode::Off) {
sr.setDoDNSSEC(true);
dq.meta = std::move(dc->d_meta);
dq.fromAuthIP = &sr.d_fromAuthIP;
- auto srLua = sr.getLuaEngine();
RunningResolveGuard tcpGuard(dc);
if (ednsExtRCode != 0 || dc->d_mdp.d_header.opcode == Opcode::Notify) {
sr.setCacheOnly();
}
- if (srLua) {
- srLua->prerpz(dq, res, sr.d_eventTrace);
+ if (dc->d_luaContext) {
+ dc->d_luaContext->prerpz(dq, res, sr.d_eventTrace);
}
// Check if the client has a policy attached to it
}
// if there is a RecursorLua active, and it 'took' the query in preResolve, we don't launch beginResolve
- if (!srLua || !srLua->preresolve(dq, res, sr.d_eventTrace)) {
+ if (!dc->d_luaContext || !dc->d_luaContext->preresolve(dq, res, sr.d_eventTrace)) {
if (!g_dns64PrefixReverse.empty() && dq.qtype == QType::PTR && dq.qname.isPartOf(g_dns64PrefixReverse)) {
res = getFakePTRRecords(dq.qname, ret);
if (wantsRPZ && appliedPolicy.d_kind != DNSFilterEngine::PolicyKind::NoAction) {
- if (srLua && srLua->policyHitEventFilter(dc->d_source, dc->d_mdp.d_qname, QType(dc->d_mdp.d_qtype), dc->d_tcp, appliedPolicy, dc->d_policyTags, sr.d_discardedPolicies)) {
+ if (dc->d_luaContext && dc->d_luaContext->policyHitEventFilter(dc->d_source, dc->d_mdp.d_qname, QType(dc->d_mdp.d_qtype), dc->d_tcp, appliedPolicy, dc->d_policyTags, sr.d_discardedPolicies)) {
/* reset to no match */
appliedPolicy = DNSFilterEngine::Policy();
}
}
}
- if (srLua || (g_dns64Prefix && dq.qtype == QType::AAAA && !vStateIsBogus(dq.validationState))) {
+ if (dc->d_luaContext || (g_dns64Prefix && dq.qtype == QType::AAAA && !vStateIsBogus(dq.validationState))) {
if (res == RCode::NoError) {
if (answerIsNOData(dc->d_mdp.d_qtype, res, ret)) {
- if (srLua && srLua->nodata(dq, res, sr.d_eventTrace)) {
+ if (dc->d_luaContext && dc->d_luaContext->nodata(dq, res, sr.d_eventTrace)) {
shouldNotValidate = true;
auto policyResult = handlePolicyHit(appliedPolicy, dc, sr, res, ret, pw, tcpGuard);
if (policyResult == PolicyResult::HaveAnswer) {
}
}
}
- else if (res == RCode::NXDomain && srLua && srLua->nxdomain(dq, res, sr.d_eventTrace)) {
+ else if (res == RCode::NXDomain && dc->d_luaContext && dc->d_luaContext->nxdomain(dq, res, sr.d_eventTrace)) {
shouldNotValidate = true;
auto policyResult = handlePolicyHit(appliedPolicy, dc, sr, res, ret, pw, tcpGuard);
if (policyResult == PolicyResult::HaveAnswer) {
}
}
- if (srLua) {
- if (srLua->d_postresolve_ffi) {
+ if (dc->d_luaContext) {
+ if (dc->d_luaContext->d_postresolve_ffi) {
RecursorLua4::PostResolveFFIHandle handle(dq);
sr.d_eventTrace.add(RecEventTrace::LuaPostResolveFFI);
- bool pr = srLua->postresolve_ffi(handle);
+ bool pr = dc->d_luaContext->postresolve_ffi(handle);
sr.d_eventTrace.add(RecEventTrace::LuaPostResolveFFI, pr, false);
if (pr) {
shouldNotValidate = true;
}
}
}
- else if (srLua->postresolve(dq, res, sr.d_eventTrace)) {
+ else if (dc->d_luaContext->postresolve(dq, res, sr.d_eventTrace)) {
shouldNotValidate = true;
auto policyResult = handlePolicyHit(appliedPolicy, dc, sr, res, ret, pw, tcpGuard);
// haveAnswer case redundant
}
}
}
- else if (srLua) {
+ else if (dc->d_luaContext) {
// preresolve returned true
shouldNotValidate = true;
auto policyResult = handlePolicyHit(appliedPolicy, dc, sr, res, ret, pw, tcpGuard);
return 0;
}
- auto dc = std::make_unique<DNSComboWriter>(question, g_now, std::move(policyTags), std::move(data), std::move(records));
+ auto dc = std::make_unique<DNSComboWriter>(question, g_now, std::move(policyTags), t_pdl, std::move(data), std::move(records));
dc->setSocket(fd);
dc->d_tag = ctag;
dc->d_qhash = qhash;
{
}
- DNSComboWriter(const std::string& query, const struct timeval& now, std::unordered_set<std::string>&& policyTags, LuaContext::LuaObject&& data, std::vector<DNSRecord>&& records) :
- d_mdp(true, query), d_now(now), d_query(query), d_policyTags(std::move(policyTags)), d_records(std::move(records)), d_data(std::move(data))
+ DNSComboWriter(const std::string& query, const struct timeval& now, std::unordered_set<std::string>&& policyTags, shared_ptr<RecursorLua4> luaContext, LuaContext::LuaObject&& data, std::vector<DNSRecord>&& records) :
+ d_mdp(true, query), d_now(now), d_query(query), d_policyTags(std::move(policyTags)), d_records(std::move(records)), d_luaContext(luaContext), d_data(std::move(data))
{
}
std::unordered_set<std::string> d_policyTags;
std::string d_routingTag;
std::vector<DNSRecord> d_records;
+
+ // d_data is tied to this LuaContext so we need to keep it alive and use it, not a newer one, as long as d_data exists
+ shared_ptr<RecursorLua4> d_luaContext;
LuaContext::LuaObject d_data;
+
EDNSSubnetOpts d_ednssubnet;
shared_ptr<TCPConnection> d_tcpConnection;
boost::optional<uint16_t> d_extendedErrorCode{boost::none};