ip_options_compile: properly handle unaligned pointer
authorChris Metcalf <cmetcalf@tilera.com>
Sun, 29 May 2011 10:55:44 +0000 (10:55 +0000)
committerDavid S. Miller <davem@zippy.davemloft.net>
Tue, 31 May 2011 22:11:02 +0000 (15:11 -0700)
commit48bdf072c3f1f8f739f76d19c74f4c79605cac46
tree0cf0f1600892a781949451df0087b2407522a5ed
parent11ad2f52826ac6d58d6780d3d8a3e098c88d9142
ip_options_compile: properly handle unaligned pointer

The current code takes an unaligned pointer and does htonl() on it to
make it big-endian, then does a memcpy().  The problem is that the
compiler decides that since the pointer is to a __be32, it is legal
to optimize the copy into a processor word store.  However, on an
architecture that does not handled unaligned writes in kernel space,
this produces an unaligned exception fault.

The solution is to track the pointer as a "char *" (which removes a bunch
of unpleasant casts in any case), and then just use put_unaligned_be32()
to write the value to memory.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Signed-off-by: David S. Miller <davem@zippy.davemloft.net>
net/ipv4/ip_options.c