Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Aug 2010 12:01:03 -0600 (MDT)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        des@des.no
Cc:        src-committers@FreeBSD.org, jilles@stack.nl, svn-src-all@FreeBSD.org, olli@fromme.com, olli@FreeBSD.org, svn-src-head@FreeBSD.org
Subject:   Re: svn commit: r211023 - head/usr.sbin/syslogd
Message-ID:  <20100810.120103.69891821625677670.imp@bsdimp.com>
In-Reply-To: <86sk2m1hsj.fsf@ds4.des.no>
References:  <201008101623.o7AGNs7I042679@haluter.fromme.com> <20100810.110642.335141733495090585.imp@bsdimp.com> <86sk2m1hsj.fsf@ds4.des.no>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <86sk2m1hsj.fsf@ds4.des.no>
            Dag-Erling Sm=F8rgrav <des@des.no> writes:
: "M. Warner Losh" <imp@bsdimp.com> writes:
: > /*
: >  * Macros to cast a struct sockaddr, or parts thereof.
: >  * On architectures with strict alignment requirements, the compile=
r
: >  * can bogusly warn about alignment problems since its static analy=
sis
: >  * is insufficient for it to know that with the APIs used, there
: >  * really is no alignment issue.
: >  */
: =

: That's a bit harsh on the compiler, don't you think?  It never pays t=
o
: hurt the compiler's feelings :)

/*
 * Macros to cast a struct sockaddr, or parts thereof.  struct
 * sockaddr's alginment is loose to later be cast to a sockaddr_in or
 * sockaddr_in6.  On architectures with strict alignment requirements,
 * this leads to compiler warnings because the compiler doesn't know
 * the ABI guarantees proper alignment.
 */

But this leads me to think that the right fix might be:

/*
 * Structure used by kernel to store most
 * addresses.
 */
struct sockaddr {
	unsigned char	sa_len;		/* total length */
	sa_family_t	sa_family;	/* address family */
	char		sa_data[14];	/* actually longer; address value */
} __aligned(4);

since that's what the ABI defines....

: > : @@ -2410,8 +2419,8 @@
: > :  				}
: > :  				reject =3D 0;
: > :  				for (j =3D 0; j < 16; j +=3D 4) {
: > : -					if ((*(u_int32_t *)&sin6->sin6_addr.s6_addr[j] & *(u_int32_=
t *)&m6p->sin6_addr.s6_addr[j])
: > : -					    !=3D *(u_int32_t *)&a6p->sin6_addr.s6_addr[j]) {
: > : +					if ((UINT32_CAST(sin6->sin6_addr.s6_addr[j]) & UINT32_CAST(=
m6p->sin6_addr.s6_addr[j]))
: > : +					    !=3D UINT32_CAST(a6p->sin6_addr.s6_addr[j])) {
: > :  						++reject;
: > :  						break;
: > :  					}
: > : =

: > : =

: >
: > Why 16 and 4 here?  What's so magical about them?
: =

: 4 =3D bytes in a uint32_t, 16 =3D bytes in an ipv6 address.

Isn't that better served by 'sizeof(uint32_t)' and
'sizeof(ipv6_addr_t)'?

Warner



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100810.120103.69891821625677670.imp>