]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
bsd: fix clang warning about alignment problem with sockaddr
authorVincent Bernat <vincent@bernat.im>
Thu, 15 May 2014 23:08:27 +0000 (01:08 +0200)
committerVincent Bernat <vincent@bernat.im>
Thu, 15 May 2014 23:08:27 +0000 (01:08 +0200)
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
src/daemon/lldpd.h
src/daemon/priv.c

index 03d8094210a6a9d11b7c2a3df86cf067ccf20b89..0e9d5524d2c14d166d012530528fd0d0d9e0c0d8 100644 (file)
@@ -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)) {
index b9c451d128f63df60ace7e71b60910ab99ea78cb..3ef34b241402f17f8d8d625039104c71de503e35 100644 (file)
@@ -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? */
index 61d5952b6e274399007c05454ad5ab16a6b1da51..8dfd9d76f1d69099c0327f168e01e8f49592ff5a 100644 (file)
@@ -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;