On Sat, 18 Dec 2004, Florian Weimer wrote:

> * James Yonan:
> 
> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> >> Program terminated with signal 10, Bus error.
> >> #0  0x120023904 in mroute_extract_addr_from_packet 
> >> (src=0x1ffffb220, dest=0x1ffffb208, buf=0x1, tunnel_type=-20292) at 
> >> mroute.c:113
> >> 113                           memcpy (src->addr, &ip->saddr, 4);
> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> >> 
> >> I think my system choke on the 'ip->saddr' address in the memcpy statement.
> >
> > That's strange that it would hit an alignment fault on a memcpy.  memcpy
> > is supposed to operate at byte granularity.
> 
> I suspect this statement is the problem:
> 
>   const struct openvpn_iphdr *ip = (const struct openvpn_iphdr *) BPTR (buf);
> 
> The cast results in undefined behavior if BPTR (buf) has the wrong
> alignment.  Recent versions of GCC know this and therefore conclude
> that BPTR must be properly aligned.  As a result, it is possible to
> replace memcpy() with something that copies word-wise.
> 
> The char * casts in your other message won't fix this, they come too
> late.  It's a common misconception that char pointers behave like
> machine addresses.  They don't.
> 
> Just to be clear, this is not a bug in GCC.  Your code is not valid C.

That's a great observation that probably explains the alpha alignment 
issues -- thanks!

James


Reply via email to