From 17ceba6064ca5a80ac708ea36ec6ef0847131945 Mon Sep 17 00:00:00 2001 From: Matias Fontanini Date: Wed, 15 Jan 2014 19:56:58 -0300 Subject: [PATCH] Fixed broken strict-aliasing rules on ICMPv6. --- src/icmpv6.cpp | 26 +++++++++++++++++++++----- tests/src/icmpv6.cpp | 2 +- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/icmpv6.cpp b/src/icmpv6.cpp index 35612af..e8615fd 100644 --- a/src/icmpv6.cpp +++ b/src/icmpv6.cpp @@ -300,23 +300,39 @@ void ICMPv6::redirect_header(const byte_array& data) { void ICMPv6::mtu(const mtu_type& value) { uint8_t buffer[sizeof(uint16_t) + sizeof(uint32_t)] = {0}; - *(uint16_t*)buffer = Endian::host_to_be(value.first); - *(uint32_t*)(buffer + sizeof(uint16_t)) = Endian::host_to_be(value.second); + const uint16_t u16_tmp = Endian::host_to_be(value.first); + const uint32_t u32_tmp = Endian::host_to_be(value.second); + buffer[0] = u16_tmp & 0xff; + buffer[1] = u16_tmp >> 8; + buffer[2] = u32_tmp & 0xff; + buffer[3] = u32_tmp >> 8; + buffer[4] = u32_tmp >> 16; + buffer[5] = u32_tmp >> 24; add_option(option(MTU, sizeof(buffer), buffer)); } void ICMPv6::shortcut_limit(const shortcut_limit_type &value) { uint8_t buffer[sizeof(uint16_t) + sizeof(uint32_t)] = {0}; + const uint32_t u32_tmp = Endian::host_to_be(value.reserved2); buffer[0] = value.limit; buffer[1] = value.reserved1; - *(uint32_t*)&buffer[2] = Endian::host_to_be(value.reserved2); + buffer[2] = u32_tmp & 0xff; + buffer[3] = u32_tmp >> 8; + buffer[4] = u32_tmp >> 16; + buffer[5] = u32_tmp >> 24; add_option(option(NBMA_SHORT_LIMIT, sizeof(buffer), buffer)); } void ICMPv6::new_advert_interval(const new_advert_interval_type &value) { uint8_t buffer[sizeof(uint16_t) + sizeof(uint32_t)] = {0}; - *(uint16_t*)buffer = Endian::host_to_be(value.reserved); - *((uint32_t*)(buffer + sizeof(uint16_t))) = Endian::host_to_be(value.interval); + const uint16_t u16_tmp = Endian::host_to_be(value.reserved); + const uint32_t u32_tmp = Endian::host_to_be(value.interval); + buffer[0] = u16_tmp & 0xff; + buffer[1] = u16_tmp >> 8; + buffer[2] = u32_tmp & 0xff; + buffer[3] = u32_tmp >> 8; + buffer[4] = u32_tmp >> 16; + buffer[5] = u32_tmp >> 24; add_option(option(ADVERT_INTERVAL, sizeof(buffer), buffer)); } diff --git a/tests/src/icmpv6.cpp b/tests/src/icmpv6.cpp index 21466cb..fbb72b3 100644 --- a/tests/src/icmpv6.cpp +++ b/tests/src/icmpv6.cpp @@ -216,7 +216,7 @@ TEST_F(ICMPv6Test, RedirectHeader) { TEST_F(ICMPv6Test, MTU) { ICMPv6 icmp; - ICMPv6::mtu_type data(0, 0x9a8df7); + ICMPv6::mtu_type data(0x1234, 0x9a8df7); icmp.mtu(data); EXPECT_EQ(data, icmp.mtu()); }