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);
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);
}
}
}