From a8a8626c2fdbb5a539d0edc2d6d4bd93fd97ce95 Mon Sep 17 00:00:00 2001 From: Gerhard Rieger Date: Mon, 4 Jan 2010 12:59:56 +0100 Subject: [PATCH] added struct sockaddr_ll to union sockaddr_union to avoid "strict aliasing" --- CHANGES | 4 ++++ VERSION | 2 +- sysutils.h | 5 ++++- xio-interface.c | 8 ++++---- xioread.c | 4 ++-- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 8ce1617..92876f5 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,8 @@ +corrections: + added struct sockaddr_ll to union sockaddr_union to avoid "strict + aliasing" warnings (problem reported by Paul Wouters) + ####################### V 1.7.1.1: corrections: diff --git a/VERSION b/VERSION index 4026ae1..bf38e8e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -"1.7.1.1" +"1.7.1.1+sockaddrll" diff --git a/sysutils.h b/sysutils.h index 5d72b26..b5146e9 100644 --- a/sysutils.h +++ b/sysutils.h @@ -1,5 +1,5 @@ /* source: sysutils.h */ -/* Copyright Gerhard Rieger 2001-2008 */ +/* Copyright Gerhard Rieger 2001-2010 */ /* Published under the GNU General Public License V.2, see file COPYING */ #ifndef __sysutils_h_included @@ -27,6 +27,9 @@ union sockaddr_union { #if WITH_IP6 struct sockaddr_in6 ip6; #endif /* WITH_IP6 */ +#if WITH_INTERFACE + struct sockaddr_ll ll; +#endif } ; #endif /* _WITH_SOCKET */ diff --git a/xio-interface.c b/xio-interface.c index f7ebb1b..d6e7f69 100644 --- a/xio-interface.c +++ b/xio-interface.c @@ -1,5 +1,5 @@ /* source: xio-interface.c */ -/* Copyright Gerhard Rieger 2008 */ +/* Copyright Gerhard Rieger 2010 */ /* Published under the GNU General Public License V.2, see file COPYING */ /* this file contains the source for opening addresses of raw socket type */ @@ -60,9 +60,9 @@ int _xioopen_interface(const char *ifname, needbind = true; } /*!!! parse by ':' */ - ((struct sockaddr_ll *)&us)->sll_family = pf; - ((struct sockaddr_ll *)&us)->sll_protocol = htons(ETH_P_ALL); - ((struct sockaddr_ll *)&us)->sll_ifindex = ifidx; + us.ll.sll_family = pf; + us.ll.sll_protocol = htons(ETH_P_ALL); + us.ll.sll_ifindex = ifidx; uslen = sizeof(sall); needbind = true; xfd->peersa = (union sockaddr_union)us; diff --git a/xioread.c b/xioread.c index 04db1eb..c000434 100644 --- a/xioread.c +++ b/xioread.c @@ -1,5 +1,5 @@ /* source: xioread.c */ -/* Copyright Gerhard Rieger 2001-2009 */ +/* Copyright Gerhard Rieger 2001-2010 */ /* Published under the GNU General Public License V.2, see file COPYING */ /* this is the source of the extended read function */ @@ -148,7 +148,7 @@ ssize_t xioread(xiofile_t *file, void *buff, size_t bufsiz) { */ #if defined(PF_PACKET) && defined(PACKET_OUTGOING) if (from.soa.sa_family == PF_PACKET) { - if ((((struct sockaddr_ll *)&from.soa)->sll_pkttype & PACKET_OUTGOING) + if ((from.ll.sll_pkttype & PACKET_OUTGOING) == 0) { errno = EAGAIN; return -1; }