Hi, On Sat, Jun 10, 2017 at 06:16:13PM +0200, Jeremie Courreges-Anglas wrote: > Loaded symbols for /usr/libexec/ld.so > #0 write_tun_header (tt=0x1ddd4e1900, buf=0x1d336921c5 "E", len=84) at > tun.c:1661 > 1661 if (iph->ip_v == 6) > (gdb) > > buf points to an odd address.
That's a single-byte access...? Nothing to be aligned here.
On FreeBSD, ip_v is defined as such:
* Structure of an internet header, naked of options.
*/
struct ip {
#if BYTE_ORDER == LITTLE_ENDIAN
u_char ip_hl:4, /* header length */
ip_v:4; /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN
u_char ip_v:4, /* version */
ip_hl:4; /* header length */
#endif
...
... so whatever it is, it's part of a single uchar at the very
beginning of that header... strange.
OTOH, the compiler might assume 16bit-alignment here and use a 16bit-
access to get the first word, then bit-shift (someone who understands
sparc64 assembly around to check?) - in this case, the following
change should help:
old:
if (iph->ip_v == 6)
new:
if (OPENVPN_IPH_GET_VER(*buf) == 6)
this is an existing macro which takes an int argument, shifting and
masking the right bits, and since *buf is "uint8_t *buf", this should
both be correct and alignment-ignorant.
It might be less efficient than accessing the bit field - but then, it's
the same work to do, so hopefully the compiler is smart enough to compile
it to the same instructions.
gert
--
USENET is *not* the non-clickable part of WWW!
//www.muc.de/~gert/
Gert Doering - Munich, Germany [email protected]
fax: +49-89-35655025 [email protected]
signature.asc
Description: PGP signature
------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________ Openvpn-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openvpn-devel
