Skip to content
Snippets Groups Projects
Commit 63d05edf authored by Grigorii Demidov's avatar Grigorii Demidov
Browse files

layer/validate: fix duplicate records in AUTHORITY section in case of WC expansion proof

parent ebf0697f
Branches
Tags
2 merge requests!254Knot Resolver 1.2.5,!216layer/validate: fix duplicate records in AUTHORITY section in case of WC expansion proof
Pipeline #2077 passed with stages
in 3 minutes and 23 seconds
......@@ -710,7 +710,7 @@ static int validate(kr_layer_t *ctx, knot_pkt_t *pkt)
/* Check if wildcard expansion detected for final query.
* If yes, copy authority. */
if ((qry->parent == NULL) && (qry->flags & QUERY_DNSSEC_WEXPAND)) {
kr_ranked_rrarray_set_wire(&req->auth_selected, true, qry->uid);
kr_ranked_rrarray_set_wire(&req->auth_selected, true, qry->uid, true);
}
/* Check and update current delegation point security status. */
......
......@@ -493,12 +493,33 @@ int kr_ranked_rrarray_add(ranked_rr_array_t *array, const knot_rrset_t *rr,
return kr_ok();
}
int kr_ranked_rrarray_set_wire(ranked_rr_array_t *array, bool to_wire, uint32_t qry_uid)
int kr_ranked_rrarray_set_wire(ranked_rr_array_t *array, bool to_wire,
uint32_t qry_uid, bool check_dups)
  • Contributor

    Could you please add comment explaining what the parameter is supposed to do? The name check_dups seems confusing because it seems that the parameter actually skips dups when constructing the answer.

  • Please register or sign in to reply
{
for (size_t i = 0; i < array->len; ++i) {
ranked_rr_array_entry_t *entry = array->at[i];
if (entry->qry_uid == qry_uid) {
entry->to_wire = to_wire;
if (entry->qry_uid != qry_uid) {
continue;
}
entry->to_wire = to_wire;
if (!check_dups) {
continue;
}
knot_rrset_t *rr = entry->rr;
for (size_t j = 0; j < array->len; ++j) {
ranked_rr_array_entry_t *stashed = array->at[j];
if (stashed->qry_uid == qry_uid) {
continue;
}
if (stashed->rr->rclass != rr->rclass ||
stashed->rr->type != rr->type) {
continue;
}
bool is_equal = knot_rrset_equal(rr, stashed->rr,
KNOT_RRSET_COMPARE_WHOLE);
if (is_equal && to_wire) {
stashed->to_wire = false;
}
}
}
return kr_ok();
......
......@@ -193,7 +193,8 @@ int kr_rrarray_add(rr_array_t *array, const knot_rrset_t *rr, knot_mm_t *pool);
int kr_ranked_rrarray_add(ranked_rr_array_t *array, const knot_rrset_t *rr,
uint8_t rank, bool to_wire, uint32_t qry_uid, knot_mm_t *pool);
int kr_ranked_rrarray_set_wire(ranked_rr_array_t *array, bool to_wire, uint32_t qry_uid);
int kr_ranked_rrarray_set_wire(ranked_rr_array_t *array, bool to_wire,
uint32_t qry_uid, bool check_dups);
void kr_rrset_print(const knot_rrset_t *rr, const char *prefix);
void kr_pkt_print(knot_pkt_t *pkt);
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment