]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
debug: warn on qname letter case mismatch
authorPetr Špaček <petr.spacek@nic.cz>
Wed, 11 Mar 2020 15:46:18 +0000 (16:46 +0100)
committerPetr Špaček <petr.spacek@nic.cz>
Wed, 25 Mar 2020 13:15:51 +0000 (14:15 +0100)
We de-randomize qname letter case very early so kr_pkt_text() should see
all lowercase. Any uppercase means mismatch.

I've considered moving debug print to an earlier place but this way it
is more visible so I like more.

lib/utils.c

index 8c7cd89dfac2e79992fca4ce39c17afb06d9dbbe..34f80cc5f24d4a769b6d21bc52b1965975082d02 100644 (file)
@@ -983,6 +983,21 @@ static char *print_section_opt(struct mempool *mp, char *endp, const knot_rrset_
 
 }
 
+/**
+ * Detect if qname contains an uppercase letter.
+ */
+static bool qname_has_uppercase(const knot_dname_t *qname) {
+       const int len = knot_dname_size(qname) - 1;  /* skip root label at the end */
+       for (int i = 1; i < len; ++i) {  /* skip first length byte */
+               /* Note: this relies on the fact that correct label lengths
+                * can't pass this test by "luck" and that correctness
+                * is checked earlier by packet parser. */
+               if (qname[i] >= 'A' && qname[i] <= 'Z')
+                       return true;
+       }
+       return false;
+}
+
 char *kr_pkt_text(const knot_pkt_t *pkt)
 {
        if (!pkt) {
@@ -1030,7 +1045,14 @@ char *kr_pkt_text(const knot_pkt_t *pkt)
        if (qdcount == 1) {
                KR_DNAME_GET_STR(qname, knot_pkt_qname(pkt));
                KR_RRTYPE_GET_STR(rrtype, knot_pkt_qtype(pkt));
-               ptr = mp_printf_append(mp, ptr, ";; QUESTION SECTION\n%s\t\t%s\n", qname, rrtype);
+               const char *qnwarn;
+               if (qname_has_uppercase(knot_pkt_qname(pkt)))
+                       qnwarn = \
+"; WARNING! Uppercase letters indicate positions with letter case mismatches!\n"
+";          Normally you should see all-lowercase qname here.\n";
+               else
+                       qnwarn = "";
+               ptr = mp_printf_append(mp, ptr, ";; QUESTION SECTION\n%s%s\t\t%s\n", qnwarn, qname, rrtype);
        } else if (qdcount > 1) {
                ptr = mp_printf_append(mp, ptr, ";; Warning: unsupported QDCOUNT %hu\n", qdcount);
        }