for (size_t i = 0; i < arr->len; ++i) {
ranked_rr_array_entry_t *entry = arr->at[i];
const knot_rrset_t *rr = entry->rr;
- if (entry->yielded || !kr_rank_test(entry->rank, KR_RANK_INITIAL)) {
+ if (entry->yielded ||
+ (!kr_rank_test(entry->rank, KR_RANK_INITIAL) &&
+ !kr_rank_test(entry->rank, KR_RANK_MISMATCH))) {
continue;
}
if (rr->type == KNOT_RRTYPE_RRSIG) {
return KR_STATE_PRODUCE;
}
- const knot_dname_t *wanted_name = NULL;
+ const knot_dname_t *wanted_name = qry->sname;
const knot_dname_t *start_name = qry->sname;
- if (qry->flags & QUERY_AWAIT_CUT) {
+ if ((qry->flags & QUERY_AWAIT_CUT) && !resume) {
const knot_dname_t *longest_ta = kr_ta_get_longest_name(trust_anchors, qry->sname);
if (longest_ta) {
start_name = longest_ta;
ns_req = false;
minimized = false;
- if (qry->parent == NULL) {
+ if (resume) {
+ wanted_name = qry->zone_cut.name;
+ } else if (qry->parent == NULL) {
int cut_labels = knot_dname_labels(qry->zone_cut.name, NULL);
int wanted_name_labels = knot_dname_labels(wanted_name, NULL);
while (wanted_name[0] && wanted_name_labels > cut_labels + name_offset) {
}
if (qry->parent == NULL &&
- ds_req && !ns_req && minimized) {
+ ds_req && !ns_req && (minimized || resume)) {
struct kr_query *next = kr_rplan_push(rplan, qry, wanted_name,
qry->sclass, KNOT_RRTYPE_NS);
if (!next) {
nods = ds_req;
}
name_offset += 1;
- } while (ds_req && ns_req);
+ } while (ds_req && ns_req && !resume);
/* Disable DNSSEC if it enters NTA. */
if (kr_ta_get(negative_anchors, wanted_name)){
void kr_dname_print(const knot_dname_t *name, const char *prefix, const char *postfix)
{
- char str[KNOT_DNAME_MAXLEN];
+ char str[KNOT_DNAME_MAXLEN] = {0};
knot_dname_to_str(str, name, KNOT_DNAME_MAXLEN);
kr_log_verbose ("%s%s%s", prefix, str, postfix);
}
void kr_rrtype_print(const uint16_t rrtype, const char *prefix, const char *postfix)
{
- char str[32];
+ char str[32] = {0};
knot_rrtype_to_string(rrtype, str, 32);
kr_log_verbose ("%s%s%s", prefix, str, postfix);
}