From: Libor Peltan Date: Mon, 2 Sep 2019 13:55:56 +0000 (+0200) Subject: nameserver: keep fixed pointer on contents to answer from X-Git-Tag: v2.9.0~122^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f00225ccd97ecdcf1ba1f974630689dbd8fc7c01;p=thirdparty%2Fknot-dns.git nameserver: keep fixed pointer on contents to answer from --- diff --git a/src/knot/modules/onlinesign/onlinesign.c b/src/knot/modules/onlinesign/onlinesign.c index ccfc3b9837..2a373192b0 100644 --- a/src/knot/modules/onlinesign/onlinesign.c +++ b/src/knot/modules/onlinesign/onlinesign.c @@ -177,9 +177,8 @@ static dnssec_nsec_bitmap_t *synth_bitmap(knot_pkt_t *pkt, const knotd_qdata_t * } uint16_t qtype = knot_pkt_qtype(qdata->query); - bool is_apex = qdata->extra->zone - && qdata->extra->zone->contents - && qdata->extra->node == qdata->extra->zone->contents->apex; + bool is_apex = (qdata->extra->contents != NULL && + qdata->extra->node == qdata->extra->contents->apex); bitmap_add_synth(map, is_apex); @@ -515,7 +514,7 @@ static knotd_in_state_t pre_routine(knotd_in_state_t state, knot_pkt_t *pkt, } } if (ret == KNOT_EOK || knot_time_cmp(ctx->event_rollover, mod->dnssec->now) <= 0) { - update_policy_from_zone(mod->dnssec->policy, qdata->extra->zone->contents); + update_policy_from_zone(mod->dnssec->policy, qdata->extra->contents); ret = knot_dnssec_key_rollover(mod->dnssec, KEY_ROLL_ALLOW_KSK_ROLL | KEY_ROLL_ALLOW_ZSK_ROLL, &resch); } if (ret == KNOT_EOK) { diff --git a/src/knot/nameserver/axfr.c b/src/knot/nameserver/axfr.c index d970956e8e..a96f6d6d21 100644 --- a/src/knot/nameserver/axfr.c +++ b/src/knot/nameserver/axfr.c @@ -134,7 +134,7 @@ static int axfr_query_init(knotd_qdata_t *qdata) /* Put data to process. */ xfr_stats_begin(&axfr->proc.stats); - zone_contents_t *contents = qdata->extra->zone->contents; + const zone_contents_t *contents = qdata->extra->contents; /* Must be non-NULL for the first message. */ assert(contents); ptrlist_add(&axfr->proc.nodes, contents->nodes, mm); @@ -173,7 +173,7 @@ int axfr_process_query(knot_pkt_t *pkt, knotd_qdata_t *qdata) switch (ret) { case KNOT_EOK: /* OK */ AXFROUT_LOG(LOG_INFO, qdata, "started, serial %u", - zone_contents_serial(qdata->extra->zone->contents)); + zone_contents_serial(qdata->extra->contents)); break; case KNOT_EDENIED: /* Not authorized, already logged. */ return KNOT_STATE_FAIL; diff --git a/src/knot/nameserver/internet.c b/src/knot/nameserver/internet.c index 03a89dbf02..bbf9d50b0d 100644 --- a/src/knot/nameserver/internet.c +++ b/src/knot/nameserver/internet.c @@ -116,7 +116,7 @@ static bool dname_cname_cannot_synth(const knot_rrset_t *rrset, const knot_dname static bool have_dnssec(knotd_qdata_t *qdata) { return knot_pkt_has_dnssec(qdata->query) && - qdata->extra->zone->contents->dnssec; + qdata->extra->contents->dnssec; } /*! \brief This is a wildcard-covered or any other terminal node for QNAME. @@ -360,7 +360,7 @@ static int name_not_found(knot_pkt_t *pkt, knotd_qdata_t *qdata) /* Find wildcard child in the zone. */ const zone_node_t *wildcard_node = zone_contents_find_wildcard_child( - qdata->extra->zone->contents, qdata->extra->encloser); + qdata->extra->contents, qdata->extra->encloser); qdata->extra->node = wildcard_node; assert(qdata->extra->node != NULL); @@ -401,7 +401,7 @@ static int name_not_found(knot_pkt_t *pkt, knotd_qdata_t *qdata) static int solve_name(int state, knot_pkt_t *pkt, knotd_qdata_t *qdata) { - int ret = zone_contents_find_dname(qdata->extra->zone->contents, qdata->name, + int ret = zone_contents_find_dname(qdata->extra->contents, qdata->name, &qdata->extra->node, &qdata->extra->encloser, &qdata->extra->previous); @@ -456,7 +456,7 @@ static int solve_answer_dnssec(int state, knot_pkt_t *pkt, knotd_qdata_t *qdata, static int solve_authority(int state, knot_pkt_t *pkt, knotd_qdata_t *qdata, void *ctx) { int ret = KNOT_ERROR; - const zone_contents_t *zone_contents = qdata->extra->zone->contents; + const zone_contents_t *zone_contents = qdata->extra->contents; switch (state) { case KNOTD_IN_STATE_HIT: /* Positive response. */ diff --git a/src/knot/nameserver/ixfr.c b/src/knot/nameserver/ixfr.c index 04c6644a44..47e9767fee 100644 --- a/src/knot/nameserver/ixfr.c +++ b/src/knot/nameserver/ixfr.c @@ -84,13 +84,13 @@ static int ixfr_process_journal(knot_pkt_t *pkt, const void *item, #undef IXFR_SAFE_PUT static int ixfr_load_chsets(journal_read_t **journal_read, zone_t *zone, - const knot_rrset_t *their_soa) + const zone_contents_t *contents, const knot_rrset_t *their_soa) { assert(journal_read); assert(zone); /* Compare serials. */ - uint32_t serial_to = zone_contents_serial(zone->contents), j_serial_to; + uint32_t serial_to = zone_contents_serial(contents), j_serial_to; uint32_t serial_from = knot_soa_serial(their_soa->rrs.rdata); if (serial_compare(serial_to, serial_from) & SERIAL_MASK_LEQ) { /* We have older/same age zone. */ return KNOT_EUPTODATE; @@ -165,7 +165,8 @@ static int ixfr_answer_init(knotd_qdata_t *qdata, uint32_t *serial_from) } memset(xfer, 0, sizeof(struct ixfr_proc)); - int ret = ixfr_load_chsets(&xfer->journal_ctx, (zone_t *)qdata->extra->zone, their_soa); + int ret = ixfr_load_chsets(&xfer->journal_ctx, (zone_t *)qdata->extra->zone, + qdata->extra->contents, their_soa); if (ret != KNOT_EOK) { mm_free(mm, xfer); return ret; @@ -180,7 +181,7 @@ static int ixfr_answer_init(knotd_qdata_t *qdata, uint32_t *serial_from) ptrlist_add(&xfer->proc.nodes, xfer->journal_ctx, mm); xfer->soa_from = knot_soa_serial(their_soa->rrs.rdata); - xfer->soa_to = zone_contents_serial(qdata->extra->zone->contents); + xfer->soa_to = zone_contents_serial(qdata->extra->contents); qdata->extra->ext = xfer; qdata->extra->ext_cleanup = &ixfr_answer_cleanup; @@ -209,7 +210,7 @@ static int ixfr_answer_soa(knot_pkt_t *pkt, knotd_qdata_t *qdata) } /* Guaranteed to have zone contents. */ - const zone_node_t *apex = qdata->extra->zone->contents->apex; + const zone_node_t *apex = qdata->extra->contents->apex; knot_rrset_t soa_rr = node_rrset(apex, KNOT_RRTYPE_SOA); if (knot_rrset_empty(&soa_rr)) { return KNOT_STATE_FAIL; diff --git a/src/knot/nameserver/nsec_proofs.c b/src/knot/nameserver/nsec_proofs.c index ce93b3460d..462d30bc8b 100644 --- a/src/knot/nameserver/nsec_proofs.c +++ b/src/knot/nameserver/nsec_proofs.c @@ -572,7 +572,7 @@ static int put_nodata(const zone_node_t *node, int nsec_prove_wildcards(knot_pkt_t *pkt, knotd_qdata_t *qdata) { - if (qdata->extra->zone->contents == NULL) { + if (qdata->extra->contents == NULL) { return KNOT_EINVAL; } @@ -584,7 +584,7 @@ int nsec_prove_wildcards(knot_pkt_t *pkt, knotd_qdata_t *qdata) return KNOT_EINVAL; } ret = put_wildcard_answer(item->node, item->prev, - qdata->extra->zone->contents, + qdata->extra->contents, item->sname, qdata, pkt); if (ret != KNOT_EOK) { break; @@ -596,21 +596,21 @@ int nsec_prove_wildcards(knot_pkt_t *pkt, knotd_qdata_t *qdata) int nsec_prove_nodata(knot_pkt_t *pkt, knotd_qdata_t *qdata) { - if (qdata->extra->zone->contents == NULL || qdata->extra->node == NULL) { + if (qdata->extra->contents == NULL || qdata->extra->node == NULL) { return KNOT_EINVAL; } return put_nodata(qdata->extra->node, qdata->extra->encloser, qdata->extra->previous, - qdata->extra->zone->contents, qdata->name, qdata, pkt); + qdata->extra->contents, qdata->name, qdata, pkt); } int nsec_prove_nxdomain(knot_pkt_t *pkt, knotd_qdata_t *qdata) { - if (qdata->extra->zone->contents == NULL) { + if (qdata->extra->contents == NULL) { return KNOT_EINVAL; } - return put_nxdomain(qdata->extra->zone->contents, + return put_nxdomain(qdata->extra->contents, qdata->extra->previous, qdata->extra->encloser, qdata->name, qdata, pkt); } @@ -618,7 +618,7 @@ int nsec_prove_nxdomain(knot_pkt_t *pkt, knotd_qdata_t *qdata) int nsec_prove_dp_security(knot_pkt_t *pkt, knotd_qdata_t *qdata) { if (qdata->extra->node == NULL || qdata->extra->encloser == NULL || - qdata->extra->zone->contents == NULL) { + qdata->extra->contents == NULL) { return KNOT_EINVAL; } @@ -634,7 +634,7 @@ int nsec_prove_dp_security(knot_pkt_t *pkt, knotd_qdata_t *qdata) // Alternatively prove that DS doesn't exist. return put_nodata(qdata->extra->node, qdata->extra->encloser, qdata->extra->previous, - qdata->extra->zone->contents, qdata->name, qdata, pkt); + qdata->extra->contents, qdata->name, qdata, pkt); } int nsec_append_rrsigs(knot_pkt_t *pkt, knotd_qdata_t *qdata, bool optional) diff --git a/src/knot/nameserver/process_query.c b/src/knot/nameserver/process_query.c index cd926b6b13..7a0185b262 100644 --- a/src/knot/nameserver/process_query.c +++ b/src/knot/nameserver/process_query.c @@ -419,6 +419,9 @@ static int prepare_answer(knot_pkt_t *query, knot_pkt_t *resp, knot_layer_t *ctx /* Find zone for QNAME. */ qdata->extra->zone = answer_zone_find(query, server->zone_db); + if (qdata->extra->zone != NULL) { + qdata->extra->contents = qdata->extra->zone->contents; + } return KNOT_EOK; } diff --git a/src/knot/nameserver/process_query.h b/src/knot/nameserver/process_query.h index c5fe49720b..cf56c869ee 100644 --- a/src/knot/nameserver/process_query.h +++ b/src/knot/nameserver/process_query.h @@ -27,6 +27,7 @@ const knot_layer_api_t *process_query_layer(void); /*! \brief Query processing intermediate data. */ typedef struct knotd_qdata_extra { const zone_t *zone; /*!< Zone from which is answered. */ + const zone_contents_t *contents; /*!< Zone contents from which is answered. */ list_t wildcards; /*!< Visited wildcards. */ list_t rrsigs; /*!< Section RRSIGs. */ uint8_t *opt_rr_pos; /*!< Place of the OPT RR in wire. */ diff --git a/src/knot/nameserver/query_module.c b/src/knot/nameserver/query_module.c index 9d1edb8ff1..9213a93aea 100644 --- a/src/knot/nameserver/query_module.c +++ b/src/knot/nameserver/query_module.c @@ -558,12 +558,11 @@ const knot_dname_t *knotd_qdata_zone_name(knotd_qdata_t *qdata) _public_ knot_rrset_t knotd_qdata_zone_apex_rrset(knotd_qdata_t *qdata, uint16_t type) { - if (qdata == NULL || qdata->extra->zone == NULL || - qdata->extra->zone->contents == NULL) { + if (qdata == NULL || qdata->extra->contents == NULL) { return node_rrset(NULL, type); } - return node_rrset(qdata->extra->zone->contents->apex, type); + return node_rrset(qdata->extra->contents->apex, type); } _public_ diff --git a/src/knot/nameserver/xfr.c b/src/knot/nameserver/xfr.c index 6dd0d3bd0b..b54a4ffe31 100644 --- a/src/knot/nameserver/xfr.c +++ b/src/knot/nameserver/xfr.c @@ -28,7 +28,7 @@ int xfr_process_list(knot_pkt_t *pkt, xfr_put_cb put, knotd_qdata_t *qdata) struct xfr_proc *xfer = qdata->extra->ext; /* Check if the zone wasn't expired during multi-message transfer. */ - zone_contents_t *contents = qdata->extra->zone->contents; + const zone_contents_t *contents = qdata->extra->contents; if (contents == NULL) { return KNOT_ENOZONE; }