]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/resolve: top-down search if NS is at current zone cut (not backtrace)
authorMarek Vavruša <marek.vavrusa@nic.cz>
Mon, 22 Jun 2015 17:15:44 +0000 (19:15 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Mon, 22 Jun 2015 17:15:44 +0000 (19:15 +0200)
lib/resolve.c

index 12a0dd778287981f695d9f3628e2040cc9a3a983..23e56f5375de34bc910832d2785ab118515b06dd 100644 (file)
@@ -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;