summaryrefslogtreecommitdiff
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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;