shared: make sure foo.bar and foobar result in different domain name hashes
authorLennart Poettering <lennart@poettering.net>
Fri, 8 Jan 2016 00:11:55 +0000 (01:11 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 11 Jan 2016 18:39:59 +0000 (19:39 +0100)
This also introduces a new macro siphash24_compress_byte() which is useful to add a single byte into the hash stream,
and ports one user over to it.

src/basic/siphash24.h
src/resolve/resolved-dns-rr.c
src/shared/dns-domain.c

index 3f7e203..54e2420 100644 (file)
@@ -16,6 +16,8 @@ struct siphash {
 
 void siphash24_init(struct siphash *state, const uint8_t k[16]);
 void siphash24_compress(const void *in, size_t inlen, struct siphash *state);
+#define siphash24_compress_byte(byte, state) siphash24_compress((const uint8_t[]) { (byte) }, 1, (state))
+
 uint64_t siphash24_finalize(struct siphash *state);
 
 uint64_t siphash24(const void *in, size_t inlen, const uint8_t k[16]);
index 993f0c4..dbf8401 100644 (file)
@@ -1120,8 +1120,9 @@ static void dns_resource_record_hash_func(const void *i, struct siphash *state)
                 LIST_FOREACH(items, j, rr->txt.items) {
                         siphash24_compress(j->data, j->length, state);
 
-                        /* Add an extra NUL byte, so that "a" followed by "b" doesn't result in the same hash as "ab" followed by "". */
-                        siphash24_compress((const uint8_t[]) { 0 }, 1, state);
+                        /* Add an extra NUL byte, so that "a" followed by "b" doesn't result in the same hash as "ab"
+                         * followed by "". */
+                        siphash24_compress_byte(0, state);
                 }
                 break;
         }
index bcfc936..5947511 100644 (file)
@@ -504,6 +504,7 @@ void dns_name_hash_func(const void *s, struct siphash *state) {
 
                 ascii_strlower_n(label, r);
                 siphash24_compress(label, r, state);
+                siphash24_compress_byte(0, state); /* make sure foobar and foo.bar result in different hashes */
         }
 
         /* enforce that all names are terminated by the empty label */