X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-domain.c;h=eea73f6d5476851a1cfa8448e2782ccc7f9f0728;hp=33ae2610e117460c2a59ac4b313234448f942229;hb=6073b6f26ab9fc6bf335faa7073ec443eef093fd;hpb=3fe1169fe3a692b8416848abc451bd1e4cbc4e4a diff --git a/src/resolve/resolved-dns-domain.c b/src/resolve/resolved-dns-domain.c index 33ae2610e..eea73f6d5 100644 --- a/src/resolve/resolved-dns-domain.c +++ b/src/resolve/resolved-dns-domain.c @@ -45,6 +45,9 @@ int dns_label_unescape(const char **name, char *dest, size_t sz) { if (sz <= 0) return -ENOSPC; + if (r >= DNS_LABEL_MAX) + return -EINVAL; + if (*n == '\\') { /* Escaped character */ @@ -114,6 +117,9 @@ int dns_label_escape(const char *p, size_t l, char **ret) { assert(p); assert(ret); + if (l > DNS_LABEL_MAX) + return -EINVAL; + s = malloc(l * 4 + 1); if (!s) return -ENOMEM; @@ -197,6 +203,9 @@ int dns_name_normalize(const char *s, char **_ret) { n += r; } + if (n > DNS_NAME_MAX) + return -EINVAL; + if (!GREEDY_REALLOC(ret, allocated, n + 1)) return -ENOMEM; @@ -209,7 +218,7 @@ int dns_name_normalize(const char *s, char **_ret) { unsigned long dns_name_hash_func(const void *s, const uint8_t hash_key[HASH_KEY_SIZE]) { const char *p = s; - unsigned long ul = 0; + unsigned long ul = hash_key[0]; int r; assert(p); @@ -224,7 +233,7 @@ unsigned long dns_name_hash_func(const void *s, const uint8_t hash_key[HASH_KEY_ label[r] = 0; ascii_strlower(label); - ul = hash_key[0] * ul + ul + string_hash_func(label, hash_key); + ul = ul * hash_key[1] + ul + string_hash_func(label, hash_key); } return ul;