]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared: dns-name - use the canonical dns name ordering
authorTom Gundersen <teg@jklm.no>
Mon, 20 Jul 2015 14:01:03 +0000 (16:01 +0200)
committerTom Gundersen <teg@jklm.no>
Mon, 27 Jul 2015 22:07:32 +0000 (00:07 +0200)
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

index 8a472fbcb431bc04a94e784dd4a0a95acf14093b..33925bfbd1ba90dd2fbd7d9e9f03fd9b9be35df4 100644 (file)
@@ -400,20 +400,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;