Denis Fondras([email protected]) on 2018.10.20 18:12:18 +0200:
> On Sat, Oct 20, 2018 at 05:30:59PM +0200, Klemens Nanni wrote:
> > On Sat, Oct 20, 2018 at 11:57:13AM +0200, Denis Fondras wrote:
> > > Sync changes to host_*() from ntpd to relayd.
> > This looks good, however I'm not a relayd user.
> > How did you test it? With both IPv4 and IPv6?
> > 
> 
> I tested both on my machine, that's not extensive test though (using listen 
> and
> forward in both IPv4 & IPv6 and checking if backend is reachable).
> 
> Also regress is IPv4 only.                                             
> 
> > Some nits inline to squash inconsistencies with other `host_ip()' users
> > in base.
> > 
> 
> Thank you, new diff below.

ok.
 
> Index: parse.y
> ===================================================================
> RCS file: /cvs/src/usr.sbin/relayd/parse.y,v
> retrieving revision 1.228
> diff -u -p -r1.228 parse.y
> --- parse.y   7 Sep 2018 07:35:31 -0000       1.228
> +++ parse.y   20 Oct 2018 16:07:19 -0000
> @@ -123,8 +123,7 @@ static enum direction      dir = RELAY_DIR_A
>  static char          *rulefile = NULL;
>  static union hashkey *hashkey = NULL;
>  
> -struct address       *host_v4(const char *);
> -struct address       *host_v6(const char *);
> +struct address       *host_ip(const char *);
>  int           host_dns(const char *, struct addresslist *,
>                   int, struct portrange *, const char *, int);
>  int           host_if(const char *, struct addresslist *,
> @@ -2929,49 +2928,22 @@ symget(const char *nam)
>  }
>  
>  struct address *
> -host_v4(const char *s)
> +host_ip(const char *s)
>  {
> -     struct in_addr           ina;
> -     struct sockaddr_in      *sain;
> -     struct address          *h;
> -
> -     bzero(&ina, sizeof(ina));
> -     if (inet_pton(AF_INET, s, &ina) != 1)
> -             return (NULL);
> -
> -     if ((h = calloc(1, sizeof(*h))) == NULL)
> -             fatal(__func__);
> -     sain = (struct sockaddr_in *)&h->ss;
> -     sain->sin_len = sizeof(struct sockaddr_in);
> -     sain->sin_family = AF_INET;
> -     sain->sin_addr.s_addr = ina.s_addr;
> -
> -     return (h);
> -}
> -
> -struct address *
> -host_v6(const char *s)
> -{
> -     struct addrinfo          hints, *res;
> -     struct sockaddr_in6     *sa_in6;
> -     struct address          *h = NULL;
> +     struct addrinfo  hints, *res;
> +     struct address  *h = NULL;
>  
> -     bzero(&hints, sizeof(hints));
> -     hints.ai_family = AF_INET6;
> -     hints.ai_socktype = SOCK_DGRAM; /* dummy */
> +     memset(&hints, 0, sizeof(hints));
> +     hints.ai_family = AF_UNSPEC;
> +     hints.ai_socktype = SOCK_DGRAM; /*dummy*/
>       hints.ai_flags = AI_NUMERICHOST;
>       if (getaddrinfo(s, "0", &hints, &res) == 0) {
> -             if ((h = calloc(1, sizeof(*h))) == NULL)
> -                     fatal(__func__);
> -             sa_in6 = (struct sockaddr_in6 *)&h->ss;
> -             sa_in6->sin6_len = sizeof(struct sockaddr_in6);
> -             sa_in6->sin6_family = AF_INET6;
> -             memcpy(&sa_in6->sin6_addr,
> -                 &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr,
> -                 sizeof(sa_in6->sin6_addr));
> -             sa_in6->sin6_scope_id =
> -                 ((struct sockaddr_in6 *)res->ai_addr)->sin6_scope_id;
> -
> +             if (res->ai_family == AF_INET ||
> +                 res->ai_family == AF_INET6) {
> +                     if ((h = calloc(1, sizeof(*h))) == NULL)
> +                             fatal(NULL);
> +                     memcpy(&h->ss, res->ai_addr, res->ai_addrlen);
> +             }
>               freeaddrinfo(res);
>       }
>  
> @@ -2984,15 +2956,13 @@ host_dns(const char *s, struct addressli
>  {
>       struct addrinfo          hints, *res0, *res;
>       int                      error, cnt = 0;
> -     struct sockaddr_in      *sain;
> -     struct sockaddr_in6     *sin6;
>       struct address          *h;
>  
>       if ((cnt = host_if(s, al, max, port, ifname, ipproto)) != 0)
>               return (cnt);
>  
>       bzero(&hints, sizeof(hints));
> -     hints.ai_family = PF_UNSPEC;
> +     hints.ai_family = AF_UNSPEC;
>       hints.ai_socktype = SOCK_DGRAM; /* DUMMY */
>       hints.ai_flags = AI_ADDRCONFIG;
>       error = getaddrinfo(s, NULL, &hints, &res0);
> @@ -3024,19 +2994,8 @@ host_dns(const char *s, struct addressli
>               }
>               if (ipproto != -1)
>                       h->ipproto = ipproto;
> -             h->ss.ss_family = res->ai_family;
>  
> -             if (res->ai_family == AF_INET) {
> -                     sain = (struct sockaddr_in *)&h->ss;
> -                     sain->sin_len = sizeof(struct sockaddr_in);
> -                     sain->sin_addr.s_addr = ((struct sockaddr_in *)
> -                         res->ai_addr)->sin_addr.s_addr;
> -             } else {
> -                     sin6 = (struct sockaddr_in6 *)&h->ss;
> -                     sin6->sin6_len = sizeof(struct sockaddr_in6);
> -                     memcpy(&sin6->sin6_addr, &((struct sockaddr_in6 *)
> -                         res->ai_addr)->sin6_addr, sizeof(struct in6_addr));
> -             }
> +             memcpy(&h->ss, res->ai_addr, res->ai_addrlen);
>  
>               TAILQ_INSERT_HEAD(al, h, entry);
>               cnt++;
> @@ -3123,34 +3082,27 @@ int
>  host(const char *s, struct addresslist *al, int max,
>      struct portrange *port, const char *ifname, int ipproto)
>  {
> -     struct address *h;
> +     struct address  *h;
>  
> -     h = host_v4(s);
> +     if ((h = host_ip(s)) == NULL)
> +             return (host_dns(s, al, max, port, ifname, ipproto));
>  
> -     /* IPv6 address? */
> -     if (h == NULL)
> -             h = host_v6(s);
> -
> -     if (h != NULL) {
> -             if (port != NULL)
> -                     bcopy(port, &h->port, sizeof(h->port));
> -             if (ifname != NULL) {
> -                     if (strlcpy(h->ifname, ifname, sizeof(h->ifname)) >=
> -                         sizeof(h->ifname)) {
> -                             log_warnx("%s: interface name truncated",
> -                                 __func__);
> -                             free(h);
> -                             return (-1);
> -                     }
> +     if (port != NULL)
> +             bcopy(port, &h->port, sizeof(h->port));
> +     if (ifname != NULL) {
> +             if (strlcpy(h->ifname, ifname, sizeof(h->ifname)) >=
> +                 sizeof(h->ifname)) {
> +                     log_warnx("%s: interface name truncated",
> +                         __func__);
> +                     free(h);
> +                     return (-1);
>               }
> -             if (ipproto != -1)
> -                     h->ipproto = ipproto;
> -
> -             TAILQ_INSERT_HEAD(al, h, entry);
> -             return (1);
>       }
> +     if (ipproto != -1)
> +             h->ipproto = ipproto;
>  
> -     return (host_dns(s, al, max, port, ifname, ipproto));
> +     TAILQ_INSERT_HEAD(al, h, entry);
> +     return (1);
>  }
>  
>  void
> 

Reply via email to