]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
module geoip: respond NODATA instead NXDMAIN where appropriate
authorLibor Peltan <libor.peltan@nic.cz>
Wed, 16 Jun 2021 13:52:01 +0000 (15:52 +0200)
committerDaniel Salzman <daniel.salzman@nic.cz>
Wed, 30 Jun 2021 05:35:00 +0000 (07:35 +0200)
src/knot/modules/geoip/geoip.c
src/knot/nameserver/internet.c
tests-extra/tests/modules/geoip/test.py

index 3263b18487fea0d0dbddc934c351a9fe37429084..999677229daf41ccaa7c5bd67fdca81b963b7785 100644 (file)
@@ -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)
index 085ad4e3b49a5d2655c9d6f17d2341e73a1237be..dab1d7fe1cb22970eaf96fc504f62b61e8cebc33 100644 (file)
@@ -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;
        }
 
index 6853ed234a86a03aa8aa9e9ca0b0b8f60b79ab86..b074261b719b1aba6acf99aff78707972b2c866d 100644 (file)
@@ -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")