]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: dns: allow 63 char in hostname
authorWilliam Dauchy <w.dauchy@criteo.com>
Sun, 26 Jan 2020 18:52:34 +0000 (19:52 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 28 Jan 2020 12:08:08 +0000 (13:08 +0100)
hostname were limited to 62 char, which is not RFC1035 compliant;
- the parsing loop should stop when above max label char
- fix len label test where d[i] was wrongly used
- simplify the whole function to avoid using two extra char* variable

this should fix github issue #387

Signed-off-by: William Dauchy <w.dauchy@criteo.com>
Reviewed-by: Tim Duesterhus <tim@bastelstu.be>
Acked-by: Baptiste <bedis9@gmail.com>
src/dns.c

index eefd8d0dcbd2518b028d0056f0ef027ce49852f1..28d47d26c503fd22fa06b119faf0d4f5a9a5df33 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -1470,7 +1470,6 @@ int dns_str_to_dn_label(const char *str, int str_len, char *dn, int dn_len)
  */
 int dns_hostname_validation(const char *string, char **err)
 {
-       const char *c, *d;
        int i;
 
        if (strlen(string) > DNS_MAX_NAME_SIZE) {
@@ -1479,36 +1478,32 @@ int dns_hostname_validation(const char *string, char **err)
                return 0;
        }
 
-       c = string;
-       while (*c) {
-               d = c;
-
+       while (*string) {
                i = 0;
-               while (*d != '.' && *d && i <= DNS_MAX_LABEL_SIZE) {
-                       i++;
-                       if (!((*d == '-') || (*d == '_') ||
-                             ((*d >= 'a') && (*d <= 'z')) ||
-                             ((*d >= 'A') && (*d <= 'Z')) ||
-                             ((*d >= '0') && (*d <= '9')))) {
+               while (*string && *string != '.' && i < DNS_MAX_LABEL_SIZE) {
+                       if (!(*string == '-' || *string == '_' ||
+                             (*string >= 'a' && *string <= 'z') ||
+                             (*string >= 'A' && *string <= 'Z') ||
+                             (*string >= '0' && *string <= '9'))) {
                                if (err)
                                        *err = DNS_INVALID_CHARACTER;
                                return 0;
                        }
-                       d++;
+                       i++;
+                       string++;
                }
 
-               if ((i >= DNS_MAX_LABEL_SIZE) && (d[i] != '.')) {
+               if (!(*string))
+                       break;
+
+               if (*string != '.' && i >= DNS_MAX_LABEL_SIZE) {
                        if (err)
                                *err = DNS_LABEL_TOO_LONG;
                        return 0;
                }
 
-               if (*d == '\0')
-                       goto out;
-
-               c = ++d;
+               string++;
        }
- out:
        return 1;
 }