On Sun, Jan 26, 2020 at 7:53 PM William Dauchy <w.dau...@criteo.com> wrote:

> 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..28d47d26c 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))
> +                       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
>
>

This patch is "approved".
Willy, you can apply.

Baptiste

Reply via email to