From 173f29a4053d6d8e21a96a0a97d4819358748b5f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Petr=20=C5=A0pa=C4=8Dek?= Date: Wed, 11 Mar 2020 16:46:18 +0100 Subject: [PATCH] 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. --- lib/utils.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) 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); } -- 2.47.2