summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2015-07-20 16:01:03 +0200
committerSven Eden <yamakuzure@gmx.net>2017-03-14 10:07:02 +0100
commitb22f231c1eb04e77ca79df676d5989ae1061fbaf (patch)
treefff175591084ccf891c93bf689cd8d2d6e4ffdfc
parentc99a8256056afe4273bee49d4ab0def3d5833b02 (diff)
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.
-rw-r--r--src/shared/dns-domain.c11
1 files 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;