From 63d05edf31e7dfc425fa958bca4d1ca33adf246c Mon Sep 17 00:00:00 2001 From: Grigorii Demidov Date: Mon, 27 Feb 2017 13:19:48 +0100 Subject: [PATCH] layer/validate: fix duplicate records in AUTHORITY section in case of WC expansion proof --- lib/layer/validate.c | 2 +- lib/utils.c | 27 ++++++++++++++++++++++++--- lib/utils.h | 3 ++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/lib/layer/validate.c b/lib/layer/validate.c index e4e99c921..1b9dd5d3e 100644 --- a/lib/layer/validate.c +++ b/lib/layer/validate.c @@ -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. */ diff --git a/lib/utils.c b/lib/utils.c index 7d59e7f26..af1b4dbd8 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -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) { 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(); diff --git a/lib/utils.h b/lib/utils.h index 041edc017..e2224413e 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -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); -- 2.47.3