VERBOSE_MSG("<= cname chain, following\n");
/* Check if the same query was already resolved */
for (int i = 0; i < req->rplan.resolved.len; ++i) {
- struct kr_query * q = req->rplan.resolved.at[i];
+ struct kr_query *q = req->rplan.resolved.at[i];
if (q->parent == query->parent &&
q->sclass == query->sclass &&
q->stype == query->stype &&
if (!next) {
return KR_STATE_FAIL;
}
+ next->flags |= QUERY_AWAIT_CUT;
if (query->flags & QUERY_FORWARD) {
- next->flags |= (QUERY_FORWARD | QUERY_AWAIT_CUT);
next->forward_flags |= QUERY_CNAME;
- state = kr_nsrep_copy_set(&next->ns, &query->ns);
- if (state != kr_ok()) {
- return KR_STATE_FAIL;
+ if (query->parent == NULL) {
+ state = kr_nsrep_copy_set(&next->ns, &query->ns);
+ if (state != kr_ok()) {
+ return KR_STATE_FAIL;
+ }
}
- } else {
- next->flags |= QUERY_AWAIT_CUT;
}
next->cname_parent = query;
/* Want DNSSEC if and only if it's posible to secure
next->flags |= QUERY_AWAIT_CUT;
}
if (qry->flags & QUERY_FORWARD) {
- int state = kr_nsrep_copy_set(&next->ns, &qry->ns);
- if (state != kr_ok()) {
- return KR_STATE_FAIL;
- }
next->flags &= ~QUERY_AWAIT_CUT;
}
next->flags |= QUERY_DNSSEC_WANT;
if (!nods && qtype != KNOT_RRTYPE_DS) {
struct kr_rplan *rplan = &req->rplan;
struct kr_query *next = kr_rplan_push(rplan, qry, qry->sname, qry->sclass, KNOT_RRTYPE_DS);
- int state = kr_nsrep_copy_set(&next->ns, &qry->ns);
- if (state != kr_ok()) {
+ if (!next) {
return KR_STATE_FAIL;
}
kr_zonecut_set(&next->zone_cut, qry->zone_cut.name);
}
} else if (qry->stype != KNOT_RRTYPE_DS) {
struct kr_rplan *rplan = &req->rplan;
- struct kr_query *next = kr_rplan_push(rplan, qry, qry->sname, qry->sclass, KNOT_RRTYPE_DS);
- int state = kr_nsrep_copy_set(&next->ns, &qry->ns);
- if (state != kr_ok()) {
+ struct kr_query *next = kr_rplan_push(rplan, qry, qry->sname,
+ qry->sclass, KNOT_RRTYPE_DS);
+ if (!next) {
return KR_STATE_FAIL;
}
kr_zonecut_set(&next->zone_cut, qry->zone_cut.name);
if (!next) {
return KR_STATE_FAIL;
}
- int state = kr_nsrep_copy_set(&next->ns, &qry->ns);
- if (state != kr_ok()) {
- return KR_STATE_FAIL;
- }
return KR_STATE_DONE;
}
}
if (ds_req && !ns_req && (minimized || resume)) {
- struct kr_query *next = kr_rplan_push(rplan, qry, wanted_name,
- qry->sclass, KNOT_RRTYPE_NS);
+ struct kr_query *next = zone_cut_subreq(rplan, qry, wanted_name,
+ KNOT_RRTYPE_NS);
if (!next) {
return KR_STATE_FAIL;
}
- int state = kr_nsrep_copy_set(&next->ns, &qry->ns);
- if (state != kr_ok()) {
- return KR_STATE_FAIL;
- }
- kr_zonecut_set(&next->zone_cut, qry->zone_cut.name);
- kr_zonecut_copy_trust(&next->zone_cut, &qry->zone_cut);
- next->flags |= QUERY_DNSSEC_WANT;
return KR_STATE_DONE;
}
ta_name = (has_ta ? qry->zone_cut.trust_anchor->owner : NULL);
refetch_ta = (!has_ta || !knot_dname_is_equal(wanted_name, ta_name));
if (!nods && want_secured && refetch_ta) {
- struct kr_query *next = kr_rplan_push(rplan, qry, wanted_name, qry->sclass, KNOT_RRTYPE_DS);
+ struct kr_query *next = zone_cut_subreq(rplan, qry, wanted_name,
+ KNOT_RRTYPE_DS);
if (!next) {
return KR_STATE_FAIL;
}
- int state = kr_nsrep_copy_set(&next->ns, &qry->ns);
- if (state != kr_ok()) {
- return KR_STATE_FAIL;
- }
- kr_zonecut_set(&next->zone_cut, qry->zone_cut.name);
- kr_zonecut_copy_trust(&next->zone_cut, &qry->zone_cut);
- next->flags |= QUERY_DNSSEC_WANT;
return KR_STATE_DONE;
}
if (!next) {
return KR_STATE_FAIL;
}
- int state = kr_nsrep_copy_set(&next->ns, &qry->ns);
- if (state != kr_ok()) {
- return KR_STATE_FAIL;
- }
return KR_STATE_DONE;
}
if (!next) {
return KR_STATE_FAIL;
}
- if (qry->flags & QUERY_FORWARD) {
- int state = kr_nsrep_copy_set(&next->ns, &qry->ns);
- if (state != kr_ok()) {
- return KR_STATE_FAIL;
- }
- } else {
- next->flags |= QUERY_AWAIT_CUT;
- }
- next->flags |= QUERY_DNSSEC_WANT;
+ next->flags |= (QUERY_AWAIT_CUT | QUERY_DNSSEC_WANT);
return KR_STATE_DONE;
}
/* Try to fetch missing DNSKEY (either missing or above current cut).
qry->reorder = qry->flags & QUERY_REORDER_RR
? knot_wire_get_id(rplan->request->answer->wire)
: 0;
+
+ /* When forwarding, keep the nameserver addresses. */
+ if (parent && (parent->flags & qry->flags & QUERY_FORWARD)) {
+ ret = kr_nsrep_copy_set(&qry->ns, &parent->ns);
+ if (ret) {
+ return NULL;
+ }
+ }
+
array_push(rplan->pending, qry);
return qry;