]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib: bail out on irresolvable nameservers
authorMarek Vavruša <marek.vavrusa@nic.cz>
Sat, 18 Apr 2015 21:43:30 +0000 (23:43 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Sat, 18 Apr 2015 21:43:30 +0000 (23:43 +0200)
lib/layer/iterate.c
lib/layer/itercache.c
lib/resolve.c
lib/rplan.h
modules/hints/hints.c
tests/testdata/iter_pcdirect.rpl [moved from tests/testdata_notimpl/iter_pcdirect.rpl with 100% similarity]

index 4e971b56896ddae5a0e20b142020ed53c5e1c51c..3deac9c7507073e1ebd31ef49a257ce517d021f1 100644 (file)
@@ -309,7 +309,7 @@ static int process_answer(knot_pkt_t *pkt, struct kr_layer_param *param)
        }
 
        /* Either way it resolves current query. */
-       query->resolved = true;
+       query->flags |= QUERY_RESOLVED;
        return KNOT_STATE_DONE;
 }
 
@@ -389,7 +389,7 @@ static int resolve(knot_layer_t *ctx, knot_pkt_t *pkt)
        assert(pkt && ctx);
        struct kr_layer_param *param = ctx->data;
        struct kr_query *query = kr_rplan_current(param->rplan);
-       if (query == NULL || query->resolved) {
+       if (query == NULL || (query->flags & QUERY_RESOLVED)) {
                return ctx->state;
        }
 
index edf363c70de609a1b1fbceb09a81026a70cb7422..166708ec7010bc35344ee0f3b8b5716c37798e22 100644 (file)
@@ -21,6 +21,7 @@
 #include <libknot/rrtype/rdname.h>
 
 #include "lib/layer/iterate.h"
+#include "lib/cache.h"
 #include "lib/module.h"
 
 #define DEBUG_MSG(fmt...) QRDEBUG(kr_rplan_current(param->rplan), " cc ",  fmt)
@@ -95,7 +96,7 @@ static int read_cache(knot_layer_t *ctx, knot_pkt_t *pkt)
        int state = read_cache_rr(txn, &cache_rr, timestamp, callback, param);
        if (state == KNOT_STATE_DONE) {
                DEBUG_MSG("=> satisfied from cache\n");
-               cur->resolved = true;
+               cur->flags |= QUERY_RESOLVED;
                return state;
        }
 
@@ -110,7 +111,7 @@ static int read_cache(knot_layer_t *ctx, knot_pkt_t *pkt)
                        }
                }
 
-               cur->resolved = true;
+               cur->flags |= QUERY_RESOLVED;
                return KNOT_STATE_DONE;
        }
 
index 47d84133aab28ebb93d2d39c90c54f55484afd4a..68d13bb67816742e3c126a1a3224f8b9faef5ad5 100644 (file)
@@ -46,6 +46,7 @@ static int ns_resolve_addr(struct kr_query *cur, struct kr_layer_param *param)
 {
        if (kr_rplan_satisfies(cur, cur->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_A) ||
            kr_rplan_satisfies(cur, cur->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_AAAA) ||
+           cur->flags & QUERY_AWAIT_ADDR) {
                DEBUG_MSG("=> dependency loop, bailing out\n");
                kr_rplan_pop(param->rplan, cur);
                return KNOT_EOK;
@@ -53,6 +54,7 @@ static int ns_resolve_addr(struct kr_query *cur, struct kr_layer_param *param)
 
        (void) kr_rplan_push(param->rplan, cur, cur->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_AAAA);
        (void) kr_rplan_push(param->rplan, cur, cur->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_A);
+       cur->flags |= QUERY_AWAIT_ADDR;
        return KNOT_EOK;
 }
 
index e780f28d11ed49da257893b75c3ee16080aa9dc2..534280d3c2204faaaa0aefa7b6b2e87ccdd5f5bd 100644 (file)
@@ -34,7 +34,9 @@
 /** Query flags */
 enum kr_query_flag {
        QUERY_NO_MINIMIZE = 1 << 0, /**< Don't minimize QNAME. */
-       QUERY_TCP         = 1 << 1  /**< Use TCP for this query. */
+       QUERY_TCP         = 1 << 1, /**< Use TCP for this query. */
+       QUERY_RESOLVED    = 1 << 2, /**< Query is resolved. */
+       QUERY_AWAIT_ADDR  = 1 << 3  /**< Query is waiting for NS address. */
 };
 
 /**
@@ -47,7 +49,6 @@ struct kr_query {
        struct kr_zonecut zone_cut;
        struct timeval timestamp;
        knot_dname_t *sname;
-       bool resolved;
        uint16_t stype;
        uint16_t sclass;
        uint16_t id;
index ed7284095d9ad011e0e7c5a392cf739ed9cdb2f9..aa73c54aafc8475e3e219aa666f780a9e478bc8d 100644 (file)
@@ -93,7 +93,7 @@ static int query(knot_layer_t *ctx, knot_pkt_t *pkt)
                        knot_rrset_add_rdata(&rr, raw_addr, addr_len, 0, &param->answer->mm);
                        callback(&rr, 0, param);
 
-                       cur->resolved = true;
+                       cur->flags |= QUERY_RESOLVED;
                        return KNOT_STATE_DONE;
                }
        }