From b22f231c1eb04e77ca79df676d5989ae1061fbaf Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Mon, 20 Jul 2015 16:01:03 +0200 Subject: [PATCH 1/1] shared: dns-name - use the canonical dns name ordering The canonical DNS name ordering considers the rightmost label the most significant, we were considering it the least significant. This is important when implementing NSEC, which relies on the correct order. --- src/shared/dns-domain.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/shared/dns-domain.c b/src/shared/dns-domain.c index e716d333e..a2b9124a9 100644 --- a/src/shared/dns-domain.c +++ b/src/shared/dns-domain.c @@ -338,20 +338,23 @@ unsigned long dns_name_hash_func(const void *s, const uint8_t hash_key[HASH_KEY_ } int dns_name_compare_func(const void *a, const void *b) { - const char *x = a, *y = b; + const char *x, *y; int r, q, k, w; assert(a); assert(b); + x = (const char *) a + strlen(a); + y = (const char *) b + strlen(b); + for (;;) { char la[DNS_LABEL_MAX+1], lb[DNS_LABEL_MAX+1]; - if (*x == 0 && *y == 0) + if (x == NULL && y == NULL) return 0; - r = dns_label_unescape(&x, la, sizeof(la)); - q = dns_label_unescape(&y, lb, sizeof(lb)); + r = dns_label_unescape_suffix(a, &x, la, sizeof(la)); + q = dns_label_unescape_suffix(b, &y, lb, sizeof(lb)); if (r < 0 || q < 0) return r - q; -- 2.30.2