Subject: Re: alignment crash in v6 ipfilter when receiving on gif
To: None <port-sparc64@NetBSD.org>
From: der Mouse <mouse@Rodents.Montreal.QC.CA>
List: port-sparc64
Date: 07/11/2007 19:28:46
>>>> + memcpy(&ip6_src, &ip6->ip6_src,
>>>> + sizeof(struct in6_addr));
>>> Unless we force a function call for memcpy, the compiler can still
>>> assume that the source is 64bit aligned and ensure that the target
>>> is 64bit aligned and to 64bit operations for the copy!
>> No, it can't - there is no magic cast involved and it knows the
>> alignment guarantees of ip6->ip6_src.
> my reading of the above patch is that gcc could use 64 bit alignment
> requiring load/stores because all the pointer types used are to 64
> bit types.
My understanding - which of course may be wrong - is that that's
somewhat of an oversimplification.
Rather, gcc knows that the source and destination are of types
requiring 64-bit alignment, and that it may therefore assume the
pointers are 64-bit aligned.
> pass a (real, not cast) "char *" or "void *" as the source, and GCC
> won't think it's always going to be aligned.
I'm not sure. It's possible to declare a char object having 64-bit
alignment in gcc (__attribute__((__aligned__(8))) or some such); it's
entirely possible that gcc will carry over alignment, so that
(char *)&ip6_src is of type "pointer to char aligned to 64-bit
boundary". I'm not even sure it would be wrong to do so.
Declare ip6_src and/or ip6->ip6_src as __attribute__((__packed__)) and
gcc should stop assuming that they have the alignment their type would
normally call for, at least as I read extend.texi.
But the *right* fix is to stop overlaying a struct ip6_hdr onto a
memory block not known to be correctly aligned for a struct ip6_hdr.
Yes, coding that way is a bit of a pain. But it's really the only way
to be correct. Anything less will come back to bite you in a sensitive
spot at some future time, just the way it is here.
/~\ The ASCII der Mouse
\ / Ribbon Campaign
X Against HTML mouse@rodents.montreal.qc.ca
/ \ Email! 7D C8 61 52 5D E7 2D 39 4E F1 31 3E E8 B3 27 4B