such things are fragile.  once fixed, they can silently break during
further refactoring.
on other hand, such functions are good candidates to write unit tests.

maybe we should consider things like cmocka ?

вс, 26 янв. 2020 г. в 22:44, William Dauchy <w.dau...@criteo.com>:

> 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
>
>
>

Reply via email to