]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
nameserver: keep fixed pointer on contents to answer from
authorLibor Peltan <libor.peltan@nic.cz>
Mon, 2 Sep 2019 13:55:56 +0000 (15:55 +0200)
committerLibor Peltan <libor.peltan@nic.cz>
Mon, 2 Sep 2019 13:55:56 +0000 (15:55 +0200)
src/knot/modules/onlinesign/onlinesign.c
src/knot/nameserver/axfr.c
src/knot/nameserver/internet.c
src/knot/nameserver/ixfr.c
src/knot/nameserver/nsec_proofs.c
src/knot/nameserver/process_query.c
src/knot/nameserver/process_query.h
src/knot/nameserver/query_module.c
src/knot/nameserver/xfr.c

index ccfc3b9837fdd60279f5e13964b24f4fbca42436..2a373192b0da01f9c57b6ed47f49e536e7e2d918 100644 (file)
@@ -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) {
index d970956e8e6c69b54d514d2bb06ad499bccdbaf6..a96f6d6d213e0c2a294c457587c0af55d8831bd2 100644 (file)
@@ -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;
index 03a89dbf02e773668ac51832f3a9219f106c48e1..bbf9d50b0d209cfaa9dd9a4e4d6681bb5598dcdc 100644 (file)
@@ -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. */
index 04c6644a443b7e546fd02cbdd1d3528885c9ca4a..47e9767fee45fd141b920a365c2cac1a0876ef96 100644 (file)
@@ -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;
index ce93b3460d5404e4d39dac79688203e7d942b0f6..462d30bc8b0758947660f01fc38af5130397f055 100644 (file)
@@ -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)
index cd926b6b13f88029cacd0d63e147faf2cde1407b..7a0185b26247f2b69a20521026a9f66f5e60e21b 100644 (file)
@@ -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;
 }
index c5fe49720b5d0030ff32d82fd15f0d1de592385d..cf56c869ee660814df2fd6cffa20b7e5285c87e2 100644 (file)
@@ -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. */
index 9d1edb8ff19ba0e22164efbf670a3e89d9cd0caa..9213a93aea78b70423f8475599eaa52d2e17ed84 100644 (file)
@@ -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_
index 6dd0d3bd0be05089a29ed808be8d53ead4534312..b54a4ffe31fba13b5def95cd26b5d053897d553a 100644 (file)
@@ -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;
        }