From 3d596bbefdd9f1e2b921bbb6dafcf3c06abab4f1 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Fri, 16 May 2014 01:08:27 +0200 Subject: [PATCH] bsd: fix clang warning about alignment problem with sockaddr While this does not seem to be extensively documented, when casting a `sockaddr *` to something else, like `sockaddr_dl *`, it is believed that initially, it was a `sockaddr_dl *`, so there is no alignment problem in this case. We use a macro to cast to `void *` to avoid the warning. --- src/daemon/interfaces-bsd.c | 2 +- src/daemon/lldpd.h | 2 ++ src/daemon/priv.c | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/daemon/interfaces-bsd.c b/src/daemon/interfaces-bsd.c index 03d80942..0e9d5524 100644 --- a/src/daemon/interfaces-bsd.c +++ b/src/daemon/interfaces-bsd.c @@ -362,7 +362,7 @@ ifbsd_extract_device(struct lldpd *cfg, struct ifaddrs *ifaddr) { struct interfaces_device *iface = NULL; - struct sockaddr_dl *saddrdl = (struct sockaddr_dl*)ifaddr->ifa_addr; + struct sockaddr_dl *saddrdl = ALIGNED_CAST(struct sockaddr_dl*, ifaddr->ifa_addr); if ((saddrdl->sdl_type != IFT_BRIDGE) && (saddrdl->sdl_type != IFT_L2VLAN) && (saddrdl->sdl_type != IFT_ETHER)) { diff --git a/src/daemon/lldpd.h b/src/daemon/lldpd.h index b9c451d1..3ef34b24 100644 --- a/src/daemon/lldpd.h +++ b/src/daemon/lldpd.h @@ -82,6 +82,8 @@ struct event_base; #define PROTO_DECODE_SIG struct lldpd *, char *, int, struct lldpd_hardware *, struct lldpd_chassis **, struct lldpd_port ** #define PROTO_GUESS_SIG char *, int +#define ALIGNED_CAST(TYPE, ATTR) ((TYPE) (void *) (ATTR)) + struct protocol { int mode; /* > 0 mode identifier (unique per protocol) */ int enabled; /* Is this protocol enabled? */ diff --git a/src/daemon/priv.c b/src/daemon/priv.c index 61d5952b..8dfd9d76 100644 --- a/src/daemon/priv.c +++ b/src/daemon/priv.c @@ -249,7 +249,7 @@ asroot_iface_multicast() must_read(PRIV_PRIVILEGED, ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN); #elif defined HOST_OS_FREEBSD || defined HOST_OS_OSX || defined HOST_OS_DRAGONFLY /* Black magic from mtest.c */ - struct sockaddr_dl *dlp = (struct sockaddr_dl *)&ifr.ifr_addr; + struct sockaddr_dl *dlp = ALIGNED_CAST(struct sockaddr_dl *, &ifr.ifr_addr); dlp->sdl_len = sizeof(struct sockaddr_dl); dlp->sdl_family = AF_LINK; dlp->sdl_index = 0; -- 2.39.5