From: Libor Peltan Date: Wed, 16 Jun 2021 13:52:01 +0000 (+0200) Subject: module geoip: respond NODATA instead NXDMAIN where appropriate X-Git-Tag: v3.1.0~50^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dede5f51c56b22d26ad50df392fafc8d6fe4c5c3;p=thirdparty%2Fknot-dns.git module geoip: respond NODATA instead NXDMAIN where appropriate --- diff --git a/src/knot/modules/geoip/geoip.c b/src/knot/modules/geoip/geoip.c index 3263b18487..999677229d 100644 --- a/src/knot/modules/geoip/geoip.c +++ b/src/knot/modules/geoip/geoip.c @@ -876,9 +876,10 @@ static knotd_in_state_t geoip_process(knotd_in_state_t state, knot_pkt_t *pkt, } return KNOTD_IN_STATE_HIT; + } else { + // view was found, but no suitable rrtype + return KNOTD_IN_STATE_NODATA; } - - return state; } int geoip_load(knotd_mod_t *mod) diff --git a/src/knot/nameserver/internet.c b/src/knot/nameserver/internet.c index 085ad4e3b4..dab1d7fe1c 100644 --- a/src/knot/nameserver/internet.c +++ b/src/knot/nameserver/internet.c @@ -432,7 +432,7 @@ static int solve_name(int state, knot_pkt_t *pkt, knotd_qdata_t *qdata) static int solve_answer(int state, knot_pkt_t *pkt, knotd_qdata_t *qdata, void *ctx) { /* Do not solve if already solved, e.g. in a module. */ - if (state == KNOTD_IN_STATE_HIT) { + if (state == KNOTD_IN_STATE_HIT || state == KNOTD_IN_STATE_NODATA) { return state; } diff --git a/tests-extra/tests/modules/geoip/test.py b/tests-extra/tests/modules/geoip/test.py index 6853ed234a..b074261b71 100644 --- a/tests-extra/tests/modules/geoip/test.py +++ b/tests-extra/tests/modules/geoip/test.py @@ -86,6 +86,11 @@ for i in range(1, 1000): resp = knot.dig("d" + str(random.randint(1, dname_count)) + ".example.com", "A", source=random_client) resp.check(rcode="NOERROR", rdata=random_client) + # check NODATA response when querying different type + resp = knot.dig("d" + str(random.randint(1, dname_count)) + ".example.com", "AAAA", source=random_client) + resp.check(rcode="NOERROR") + resp.check_count(1, "SOA", section="authority") + # Restart with subnet module. knot.clear_modules(zone) knot.add_module(zone, mod_subnet); @@ -104,6 +109,10 @@ for i in range(1, 1000): resp = knot.dig("d" + str(random.randint(1, dname_count)) + ".example.com", "A", source=random_client) resp.check(rcode="NOERROR", rdata=random_client) + resp = knot.dig("d" + str(random.randint(1, dname_count)) + ".example.com", "AAAA", source=random_client) + resp.check(rcode="NOERROR") + resp.check_count(1, "SOA", section="authority") + # Switch subnet file. shutil.move(subnet2_filename, subnet_filename) knot.ctl("-f zone-reload example.com.", wait=True) @@ -115,3 +124,7 @@ for i in range(1, 1000): expected_rdata = "126.255." + middle + ".0" resp = knot.dig("d" + str(random.randint(1, dname_count)) + ".example.com", "A", source=random_client) resp.check(rcode="NOERROR", rdata=expected_rdata, nordata=random_client) + + resp = knot.dig("d" + str(random.randint(1, dname_count)) + ".example.com", "AAAA", source=random_client) + resp.check(rcode="NOERROR") + resp.check_count(1, "SOA", section="authority")