On Sat, Aug 31, 2019 at 12:07:21AM +0200, Alexander Bluhm wrote:
> On Fri, Aug 30, 2019 at 09:54:49PM +0200, Claudio Jeker wrote:
> > Just throw a struct sockaddr_storage in that union. It will make sure
> > there is enough space for everything and then you can skip the MAXIMUM
> > dance you do now.
> 
> Yes, that is much nicer.  Although I have to work around this
> compiler warning.
> 
> /home/bluhm/openbsd/cvs/src/sbin/route/route.c:911:19: warning: implicit
>       conversion from 'unsigned long' to '__uint8_t' (aka 'unsigned char')
>       changes value from 256 to 0 [-Wconstant-conversion]
>                 su->sa.sa_len = sizeof(*su);
>                               ~ ^~~~~~~~~~~
> ok?
> 
> bluhm
> 
> Index: sbin/route/route.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sbin/route/route.c,v
> retrieving revision 1.232
> diff -u -p -r1.232 route.c
> --- sbin/route/route.c        29 Aug 2019 22:42:16 -0000      1.232
> +++ sbin/route/route.c        30 Aug 2019 21:58:13 -0000
> @@ -484,7 +484,7 @@ newroute(int argc, char **argv)
>                               break;
>                       case K_SA:
>                               af = PF_ROUTE;
> -                             aflen = sizeof(union sockunion);
> +                             aflen = sizeof(struct sockaddr_storage) - 1;
>                               break;
>                       case K_MPLS:
>                               af = AF_MPLS;
> @@ -908,7 +908,7 @@ getaddr(int which, int af, char *s, stru
>       case AF_MPLS:
>               errx(1, "mpls labels require -in or -out switch");
>       case PF_ROUTE:
> -             su->sa.sa_len = sizeof(*su);
> +             su->sa.sa_len = sizeof(struct sockaddr_storage) - 1;
>               sockaddr(s, &su->sa);
>               return (1);
> 

Ugh, this could be cleaned up but that is a different diff.
I think aflen should be killed and instead the sa_len should be set based
on the af. Also sockaddr() could itself know about the max size and not
have that passed in via su->sa.sa_len.

Guess that is a different diff to make this not more insane.
Also when was the last time someone used -sa in route(8)?

> Index: sbin/route/show.h
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sbin/route/show.h,v
> retrieving revision 1.14
> diff -u -p -r1.14 show.h
> --- sbin/route/show.h 1 May 2018 18:13:21 -0000       1.14
> +++ sbin/route/show.h 30 Aug 2019 21:46:34 -0000
> @@ -26,6 +26,7 @@ union sockunion {
>       struct sockaddr_dl      sdl;
>       struct sockaddr_rtlabel rtlabel;
>       struct sockaddr_mpls    smpls;
> +     struct sockaddr_storage padding;
>  };
> 
>  void  get_rtaddrs(int, struct sockaddr *, struct sockaddr **);
> Index: usr.sbin/arp/arp.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/arp/arp.c,v
> retrieving revision 1.85
> diff -u -p -r1.85 arp.c
> --- usr.sbin/arp/arp.c        29 Aug 2019 19:11:15 -0000      1.85
> +++ usr.sbin/arp/arp.c        30 Aug 2019 13:57:15 -0000
> @@ -675,9 +675,8 @@ rtmsg(int cmd)
> 
>  #define NEXTADDR(w, s)                                                       
> \
>       if (rtm->rtm_addrs & (w)) {                                     \
> -             l = ROUNDUP(((struct sockaddr *)&(s))->sa_len);         \
> -             memcpy(cp, &(s), l);                                    \
> -             cp += l;                                                \
> +             memcpy(cp, &(s), sizeof(s));                            \
> +             ADVANCE(cp, (struct sockaddr *)&(s));                   \
>       }
> 
>       NEXTADDR(RTA_DST, sin_m);
> Index: usr.sbin/ndp/ndp.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/ndp/ndp.c,v
> retrieving revision 1.97
> diff -u -p -r1.97 ndp.c
> --- usr.sbin/ndp/ndp.c        27 Aug 2019 20:42:40 -0000      1.97
> +++ usr.sbin/ndp/ndp.c        30 Aug 2019 14:08:52 -0000
> @@ -108,6 +108,7 @@
>  /* packing rule for routing socket */
>  #define ROUNDUP(a) \
>       ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
> +#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
> 
>  static pid_t pid;
>  static int nflag;
> @@ -323,7 +324,7 @@ parse_host(const char *host, struct in6_
>  struct       sockaddr_in6 so_mask = {sizeof(so_mask), AF_INET6 };
>  struct       sockaddr_in6 blank_sin = {sizeof(blank_sin), AF_INET6 }, sin_m;
>  struct       sockaddr_dl blank_sdl = {sizeof(blank_sdl), AF_LINK }, sdl_m;
> -struct       sockaddr_dl ifp_m = { sizeof(&ifp_m), AF_LINK };
> +struct       sockaddr_dl ifp_m = { sizeof(ifp_m), AF_LINK };
>  time_t       expire_time;
>  int  flags, found_entry;
>  struct       {
> @@ -766,9 +767,12 @@ rtmsg(int cmd)
>       case RTM_GET:
>               rtm->rtm_addrs |= (RTA_DST | RTA_IFP);
>       }
> -#define NEXTADDR(w, s) \
> -     if (rtm->rtm_addrs & (w)) { \
> -             bcopy((char *)&s, cp, sizeof(s)); cp += ROUNDUP(sizeof(s));}
> +
> +#define NEXTADDR(w, s)                                                       
> \
> +     if (rtm->rtm_addrs & (w)) {                                     \
> +             memcpy(cp, &(s), sizeof(s));                            \
> +             ADVANCE(cp, (struct sockaddr *)&(s));                   \
> +     }
> 
>       NEXTADDR(RTA_DST, sin_m);
>       NEXTADDR(RTA_GATEWAY, sdl_m);
> @@ -825,7 +829,7 @@ rtget(struct sockaddr_in6 **sinp, struct
>                               default:
>                                       break;
>                               }
> -                             cp += ROUNDUP(sa->sa_len);
> +                             ADVANCE(cp, sa);
>                       }
>               }
>       }
> 

Diff is OK claudio@

-- 
:wq Claudio

Reply via email to