From: Grigorii Demidov Date: Thu, 22 Nov 2018 12:53:03 +0000 (+0100) Subject: force kresd to follow net.ip(4,6) settings when forwarding X-Git-Tag: v3.2.0~19^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=06bf7a39806f44440a496b83585f798ba3703b4d;p=thirdparty%2Fknot-resolver.git force kresd to follow net.ip(4,6) settings when forwarding --- diff --git a/lib/nsrep.c b/lib/nsrep.c index ee5f34191..69d963474 100644 --- a/lib/nsrep.c +++ b/lib/nsrep.c @@ -280,23 +280,24 @@ int kr_nsrep_set(struct kr_query *qry, size_t index, const struct sockaddr *sock if (index >= KR_NSREP_MAXADDR) { return kr_error(ENOSPC); } - qry->ns.name = (const uint8_t *)""; - /* Reset score on first entry */ - if (index == 0) { - qry->ns.score = KR_NS_UNKNOWN; - qry->ns.reputation = 0; - } if (!sock) { + qry->ns.name = (const uint8_t *)""; qry->ns.addr[index].ip.sa_family = AF_UNSPEC; return kr_ok(); } switch (sock->sa_family) { case AF_INET: + if (qry->flags.NO_IPV4) { + return kr_error(ENOENT); + } qry->ns.addr[index].ip4 = *(const struct sockaddr_in *)sock; break; case AF_INET6: + if (qry->flags.NO_IPV6) { + return kr_error(ENOENT); + } qry->ns.addr[index].ip6 = *(const struct sockaddr_in6 *)sock; break; default: @@ -304,6 +305,13 @@ int kr_nsrep_set(struct kr_query *qry, size_t index, const struct sockaddr *sock return kr_error(EINVAL); } + qry->ns.name = (const uint8_t *)""; + /* Reset score on first entry */ + if (index == 0) { + qry->ns.score = KR_NS_UNKNOWN; + qry->ns.reputation = 0; + } + /* Retrieve RTT from cache */ struct kr_context *ctx = qry->ns.ctx; kr_nsrep_rtt_lru_entry_t *rtt_cache_entry = ctx diff --git a/modules/policy/policy.lua b/modules/policy/policy.lua index 638d00bfe..56c57d613 100644 --- a/modules/policy/policy.lua +++ b/modules/policy/policy.lua @@ -82,7 +82,8 @@ end -- Override the list of nameservers (forwarders) local function set_nslist(qry, list) for i, ns in ipairs(list) do - assert(ffi.C.kr_nsrep_set(qry, i - 1, ns) == 0); + -- kr_nsrep_set() can return kr_error(ENOENT), it's OK + ffi.C.kr_nsrep_set(qry, i - 1, ns) end -- If less than maximum NSs, insert guard to terminate the list if #list < 4 then