]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
adapt to libknot 3.2 lower-casing knot_pkt_qname()
authorVladimír Čunát <vladimir.cunat@nic.cz>
Wed, 15 Jun 2022 08:46:19 +0000 (10:46 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Tue, 26 Jul 2022 15:38:42 +0000 (17:38 +0200)
Our strategy was (and remains) that the in-header QNAME is overwritten
in-place, so most of our code was already (correctly) assuming that
knot_pkt_qname() returns lower-case only.  That simplifies this commit.

daemon/lua/kres.lua
lib/layer/iterate.c
lib/resolve.c
lib/utils.h

index 3d4e7ced23be06e66765f1410c165946c6029455..4dc2b402bc2d3de0e6fcfda44ad051182f339021 100644 (file)
@@ -631,7 +631,7 @@ ffi.metatype( knot_pkt_t, {
                -- Question
                qname = function(pkt)
                        assert(ffi.istype(knot_pkt_t, pkt))
-                       -- inlined knot_pkt_qname(), basically
+                       -- inlined knot_pkt_qname(), basically but not lower-cased
                        if pkt == nil or pkt.qname_size == 0 then return nil end
                        return ffi.string(pkt.wire + 12, pkt.qname_size)
                end,
index ab5370849828c9121a84b9f997dd3ebd3c160a0c..b1c3df40f01625f4b94d3b329622d573c6ee91e9 100644 (file)
@@ -77,7 +77,7 @@ static bool is_paired_to_query(const knot_pkt_t *answer, struct kr_query *query)
               qtype          == knot_pkt_qtype(answer) &&
               /* qry->secret had been xor-applied to answer already,
                * so this also checks for correctness of case randomization */
-              knot_dname_is_equal(qname, knot_pkt_qname(answer));
+              knot_dname_is_equal(qname, kr_pkt_qname_raw(answer));
 }
 
 /** Relaxed rule for AA, either AA=1 or SOA matching zone cut is required. */
index a1bed095dc15ea567d78fdaacceeb4d921e9b2b0..877b078a3270f65a044285676cc44eaa188f2058 100644 (file)
@@ -813,7 +813,7 @@ int kr_resolve_consume(struct kr_request *request, struct kr_transport **transpo
                return KR_STATE_PRODUCE;
 
        /* Packet cleared, derandomize QNAME. */
-       knot_dname_t *qname_raw = knot_pkt_qname(packet);
+       knot_dname_t *qname_raw = kr_pkt_qname_raw(packet);
        if (qname_raw && qry->secret != 0) {
                randomized_qname_case(qname_raw, qry->secret);
        }
@@ -1425,7 +1425,7 @@ int kr_resolve_produce(struct kr_request *request, struct kr_transport **transpo
 
        /* Randomize query case (if not in not turned off) */
        qry->secret = qry->flags.NO_0X20 ? 0 : kr_rand_bytes(sizeof(qry->secret));
-       knot_dname_t *qname_raw = knot_pkt_qname(packet);
+       knot_dname_t *qname_raw = kr_pkt_qname_raw(packet);
        randomized_qname_case(qname_raw, qry->secret);
 
        /*
@@ -1529,9 +1529,9 @@ int kr_resolve_checkout(struct kr_request *request, const struct sockaddr *src,
        }
 
        /* Randomize query case (if secret changed) */
-       knot_dname_t *qname = knot_pkt_qname(packet);
+       knot_dname_t *qname_raw = kr_pkt_qname_raw(packet);
        if (qry->secret != old_minimization_secret) {
-               randomized_qname_case(qname, qry->secret);
+               randomized_qname_case(qname_raw, qry->secret);
        }
 
        /* Write down OPT unless in safemode */
index cede7bef3d4c0a8c36733a8b8f2e928f0df9fc23..c3661d361d922d4523de5954cf1caff2a51a9883 100644 (file)
@@ -248,6 +248,20 @@ int kr_pkt_put(knot_pkt_t *pkt, const knot_dname_t *name, uint32_t ttl,
 KR_EXPORT
 void kr_pkt_make_auth_header(knot_pkt_t *pkt);
 
+/** Get pointer to the in-header QNAME.
+ *
+ * That's normally not lower-cased.  However, when receiving packets from upstream
+ * we xor-apply the secret during packet-parsing, so it would get lower-cased
+ * after that point if the case was right.
+ */
+static inline knot_dname_t * kr_pkt_qname_raw(const knot_pkt_t *pkt)
+{
+       if (pkt == NULL || pkt->qname_size == 0) {
+               return NULL;
+       }
+       return pkt->wire + KNOT_WIRE_HEADER_SIZE;
+}
+
 /** Simple storage for IPx address and their ports or AF_UNSPEC. */
 union kr_sockaddr {
        struct sockaddr ip;