static void fetch_glue(knot_pkt_t *pkt, const knot_dname_t *ns, struct kr_query *qry)
{
- const knot_pktsection_t *ar = knot_pkt_section(pkt, KNOT_ADDITIONAL);
- for (unsigned i = 0; i < ar->count; ++i) {
- const knot_rrset_t *rr = knot_pkt_rr(ar, i);
- if (knot_dname_is_equal(ns, rr->owner)) {
- (void) update_nsaddr(rr, qry);
+ for (knot_section_t i = KNOT_ANSWER; i <= KNOT_ADDITIONAL; ++i) {
+ const knot_pktsection_t *sec = knot_pkt_section(pkt, i);
+ for (unsigned k = 0; k < sec->count; ++k) {
+ const knot_rrset_t *rr = knot_pkt_rr(sec, k);
+ if (knot_dname_is_equal(ns, rr->owner)) {
+ (void) update_nsaddr(rr, qry);
+ }
}
}
}
/** Attempt to find glue for given nameserver name (best effort). */
static int has_glue(knot_pkt_t *pkt, const knot_dname_t *ns, struct kr_request *req)
{
- const knot_pktsection_t *ar = knot_pkt_section(pkt, KNOT_ADDITIONAL);
- for (unsigned i = 0; i < ar->count; ++i) {
- const knot_rrset_t *rr = knot_pkt_rr(ar, i);
- if (knot_dname_is_equal(ns, rr->owner) &&
- (rr->type == KNOT_RRTYPE_A || rr->type == KNOT_RRTYPE_AAAA)) {
- return 1;
+ for (knot_section_t i = KNOT_ANSWER; i <= KNOT_ADDITIONAL; ++i) {
+ const knot_pktsection_t *sec = knot_pkt_section(pkt, i);
+ for (unsigned k = 0; k < sec->count; ++k) {
+ const knot_rrset_t *rr = knot_pkt_rr(sec, k);
+ if (knot_dname_is_equal(ns, rr->owner) &&
+ (rr->type == KNOT_RRTYPE_A || rr->type == KNOT_RRTYPE_AAAA)) {
+ return 1;
+ }
}
}
return 0;
}
}
-static void ns_fetch_cut(struct kr_query *qry, struct kr_request *req)
+static int ns_fetch_cut(struct kr_query *qry, struct kr_request *req)
{
struct kr_cache_txn txn;
+ int ret = 0;
if (kr_cache_txn_begin(&req->ctx->cache, &txn, NAMEDB_RDONLY) != 0) {
- kr_zonecut_set_sbelt(&qry->zone_cut);
+ ret = kr_zonecut_set_sbelt(&qry->zone_cut);
} else {
/* If at/subdomain of parent zone cut, start from 'one up' to avoid loops */
struct kr_query *parent = qry->parent;
start_from = parent->zone_cut.name;
}
/* Find closest zone cut from cache */
- kr_zonecut_find_cached(req->ctx, &qry->zone_cut, start_from, &txn, qry->timestamp.tv_sec);
+ ret = kr_zonecut_find_cached(req->ctx, &qry->zone_cut, start_from, &txn, qry->timestamp.tv_sec);
kr_cache_txn_abort(&txn);
}
+ return ret;
}
static int ns_resolve_addr(struct kr_query *qry, struct kr_request *param)
* now it's the time to look up closest zone cut from cache.
*/
if (qry->flags & QUERY_AWAIT_CUT) {
- ns_fetch_cut(qry, request);
+ int ret = ns_fetch_cut(qry, request);
+ if (ret != 0) {
+ return KNOT_STATE_FAIL;
+ }
qry->flags &= ~QUERY_AWAIT_CUT;
/* Update minimized QNAME if zone cut changed */
if (qry->zone_cut.name[0] != '\0' && !(qry->flags & QUERY_NO_MINIMIZE)) {