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.dau...@criteo.com> --- src/dns.c | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/dns.c b/src/dns.c index eefd8d0dc..212c55f0d 100644 --- 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 == '\0') + 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; } -- 2.24.1