]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/resolve: fixed aborted rec when all IPv6 NS were bad
authorMarek Vavruša <marek.vavrusa@nic.cz>
Sun, 28 Jun 2015 23:06:56 +0000 (01:06 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Sun, 28 Jun 2015 23:06:56 +0000 (01:06 +0200)
the query flags were cleared too early, and the rec never
retried if the NS had ipv6 addresses, but all were bad

lib/resolve.c
tests/testdata/iter_minim_nonempty.rpl
tests/testdata/iter_ns_badip.rpl

index d71532ad42bfa1978602a1935c3ec728e39f390e..1e67c228237d9cf81f192c747ad0bd9f568da323 100644 (file)
@@ -88,13 +88,15 @@ static int ns_resolve_addr(struct kr_query *qry, struct kr_request *param)
                next_type = KNOT_RRTYPE_A;
                qry->flags |= QUERY_AWAIT_IPV4;
                /* Hmm, no useable IPv6 then. */
-               kr_nsrep_update_rep(&qry->ns, qry->ns.reputation | KR_NS_NOIP6, ctx->cache_rep);
+               qry->ns.reputation |= KR_NS_NOIP6;
+               kr_nsrep_update_rep(&qry->ns, qry->ns.reputation, ctx->cache_rep);
        }
        /* Bail out if the query is already pending or dependency loop. */
        if (!next_type || kr_rplan_satisfies(qry->parent, qry->ns.name, KNOT_CLASS_IN, next_type)) {
                /* No IPv4 nor IPv6, flag server as unuseable. */
                DEBUG_MSG("=> unresolvable NS address, bailing out\n");
-               kr_nsrep_update_rep(&qry->ns, qry->ns.reputation | KR_NS_NOIP4, ctx->cache_rep);
+               qry->ns.reputation |= KR_NS_NOIP4 | KR_NS_NOIP6;
+               kr_nsrep_update_rep(&qry->ns, qry->ns.reputation, ctx->cache_rep);
                invalidate_ns(rplan, qry);
                return kr_error(EHOSTUNREACH);
        }
@@ -389,6 +391,8 @@ int kr_resolve_consume(struct kr_request *request, knot_pkt_t *packet)
                struct timeval now;
                gettimeofday(&now, NULL);
                kr_nsrep_update_rtt(&qry->ns, time_diff(&qry->timestamp, &now), ctx->cache_rtt);
+               /* Sucessful answer, lift any address resolution requests. */
+               qry->flags &= ~(QUERY_AWAIT_IPV6|QUERY_AWAIT_IPV4);
        }
 
        /* Pop query if resolved. */
@@ -482,9 +486,6 @@ ns_election:
                }
                knot_overlay_reset(&request->overlay);
                return KNOT_STATE_PRODUCE;
-       } else {
-               /* Address resolved, clear the flag */
-               qry->flags &= ~(QUERY_AWAIT_IPV6|QUERY_AWAIT_IPV4);
        }
 
 #ifndef NDEBUG
index 4649344804ed4339ac1627ffc78054d1e98d5692..2d65fe37d0d6665065186a319a3461d0bb4a0549 100644 (file)
@@ -72,7 +72,7 @@ RANGE_END
 RANGE_BEGIN 0 100
        ADDRESS 1.1.1.1
 
-EANGE_END
+RANGE_END
 
 ; a.gtld-servers.net.
 RANGE_BEGIN 0 100
index b2152a7743b8c82859354f4ec0f0ae17dfd09f3d..7e379a4dcfa9da6c472c871edcae4278cd620957 100644 (file)
@@ -32,8 +32,6 @@ SECTION QUESTION
 com. IN A
 SECTION AUTHORITY
 com.   IN NS   a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net.    IN      A       192.5.6.30
 ENTRY_END
 
 ENTRY_BEGIN
@@ -49,14 +47,20 @@ ENTRY_END
 ENTRY_BEGIN
 MATCH opcode qtype qname
 ADJUST copy_id copy_query
-REPLY QR NOERROR
+REPLY QR AA NOERROR
 SECTION QUESTION
 a.gtld-servers.net.    IN      AAAA
-SECTION AUTHORITY
-. SOA bla bla 1 2 3 4 5
+SECTION ANSWER
+; Intentional bad address
+a.gtld-servers.net.    IN      AAAA    1:2:3::4
 ENTRY_END
 RANGE_END
 
+; a.gtld-servers.net.
+RANGE_BEGIN 0 100
+       ADDRESS 1:2:3::4
+RANGE_END
+
 ; a.gtld-servers.net.
 RANGE_BEGIN 0 100
        ADDRESS 192.5.6.30