From: Marek VavruĊĦa Date: Mon, 22 Jun 2015 17:15:44 +0000 (+0200) Subject: lib/resolve: top-down search if NS is at current zone cut (not backtrace) X-Git-Tag: v1.0.0-beta1~111 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0e033780e03a66342db9ef28eaa407406cea3ea8;p=thirdparty%2Fknot-resolver.git lib/resolve: top-down search if NS is at current zone cut (not backtrace) --- diff --git a/lib/resolve.c b/lib/resolve.c index 12a0dd778..23e56f537 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -53,17 +53,17 @@ static int ns_fetch_cut(struct kr_query *qry, struct kr_request *req) { struct kr_cache_txn txn; int ret = 0; + + /* If at/subdomain of parent zone cut, start top-down search */ + struct kr_query *parent = qry->parent; + if (parent && knot_dname_in(parent->zone_cut.name, qry->sname)) { + return kr_zonecut_set_sbelt(req->ctx, &qry->zone_cut); + } + /* Find closest zone cut from cache */ if (kr_cache_txn_begin(&req->ctx->cache, &txn, NAMEDB_RDONLY) != 0) { ret = kr_zonecut_set_sbelt(req->ctx, &qry->zone_cut); } else { - /* If at/subdomain of parent zone cut, start from 'one up' to avoid loops */ - struct kr_query *parent = qry->parent; - const knot_dname_t *start_from = qry->sname; - if (parent && knot_dname_in(parent->zone_cut.name, qry->sname)) { - start_from = parent->zone_cut.name; - } - /* Find closest zone cut from cache */ - ret = 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, qry->sname, &txn, qry->timestamp.tv_sec); kr_cache_txn_abort(&txn); } return ret;