Commit 63d05edf authored by Grigorii Demidov's avatar Grigorii Demidov

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

parent ebf0697f
...@@ -710,7 +710,7 @@ static int validate(kr_layer_t *ctx, knot_pkt_t *pkt) ...@@ -710,7 +710,7 @@ static int validate(kr_layer_t *ctx, knot_pkt_t *pkt)
/* Check if wildcard expansion detected for final query. /* Check if wildcard expansion detected for final query.
* If yes, copy authority. */ * If yes, copy authority. */
if ((qry->parent == NULL) && (qry->flags & QUERY_DNSSEC_WEXPAND)) { 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. */ /* 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, ...@@ -493,12 +493,33 @@ int kr_ranked_rrarray_add(ranked_rr_array_t *array, const knot_rrset_t *rr,
return kr_ok(); 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)
{ {
for (size_t i = 0; i < array->len; ++i) { for (size_t i = 0; i < array->len; ++i) {
ranked_rr_array_entry_t *entry = array->at[i]; ranked_rr_array_entry_t *entry = array->at[i];
if (entry->qry_uid == qry_uid) { if (entry->qry_uid != qry_uid) {
entry->to_wire = to_wire; 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(); return kr_ok();
......
...@@ -193,7 +193,8 @@ int kr_rrarray_add(rr_array_t *array, const knot_rrset_t *rr, knot_mm_t *pool); ...@@ -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, 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); 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_rrset_print(const knot_rrset_t *rr, const char *prefix);
void kr_pkt_print(knot_pkt_t *pkt); void kr_pkt_print(knot_pkt_t *pkt);
......
Markdown is supported
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