Fix strict aliasing violation in inet_checksum()
authorMaciej S. Szmigiero <mail@maciej.szmigiero.name>
Tue, 16 Apr 2019 13:00:50 +0000 (15:00 +0200)
committerMaciej S. Szmigiero <mail@maciej.szmigiero.name>
Tue, 16 Apr 2019 13:01:22 +0000 (15:01 +0200)
commitf3ba50ed3d14749b7c1ef100d2a49ac30d3b3853
treeb8defbdd961948d6be3ad53ca055f998387ae7ce
parentf8190b7233871b5b47c3fc8846731d1bbdef78a5
Fix strict aliasing violation in inet_checksum()

inet_checksum() accesses packet data as an array of uint16_t, but the
packet data can be for example of "anonymous struct pseudo" type from
route_ipv6_unreachable().
This type isn't a compatible type with uint16_t so a strict aliasing
violation occurs and causes the checksum to be computed incorrectly.

Fix this by using the memcpy() idiom to read the packet data as an array of
uint16_t in inet_checksum() (this should be understood by compilers and
optimized accordingly, so no actual copy occurs).
src/route.c