From: Petr Špaček Date: Wed, 11 Mar 2020 15:46:18 +0000 (+0100) Subject: debug: warn on qname letter case mismatch X-Git-Tag: v5.1.0~26^2~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=173f29a4053d6d8e21a96a0a97d4819358748b5f;p=thirdparty%2Fknot-resolver.git debug: warn on qname letter case mismatch 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. --- diff --git a/lib/utils.c b/lib/utils.c index 8c7cd89df..34f80cc5f 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -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); }