Fixes compiler warnings (undefined behavior) by making the copy explicit to comply to strict aliasing rules. With newer GCC the old code could actually lead to undefined behaviour.
See e.g. http://blog.regehr.org/archives/959. Signed-off-by: Steffan Karger <stef...@karger.me> --- src/openvpn/mroute.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/openvpn/mroute.h b/src/openvpn/mroute.h index 608f70b..1296285 100644 --- a/src/openvpn/mroute.h +++ b/src/openvpn/mroute.h @@ -189,16 +189,20 @@ mroute_extract_in_addr_t (struct mroute_addr *dest, const in_addr_t src) dest->type = MR_ADDR_IPV4; dest->netbits = 0; dest->len = 4; - *(in_addr_t*)dest->addr = htonl (src); + in_addr_t tmp_addr = htonl (src); + memcpy(dest->addr, &tmp_addr, sizeof(uint32_t)); } static inline in_addr_t in_addr_t_from_mroute_addr (const struct mroute_addr *addr) { - if ((addr->type & MR_ADDR_MASK) == MR_ADDR_IPV4 && addr->netbits == 0 && addr->len == 4) - return ntohl(*(in_addr_t*)addr->addr); - else + if ((addr->type & MR_ADDR_MASK) == MR_ADDR_IPV4 && addr->netbits == 0 && addr->len == 4) { + in_addr_t tmp = 0; + memcpy(&tmp, addr->addr, sizeof(tmp)); + return ntohl(tmp); + } else { return 0; + } } static inline void -- 2.7.4 ------------------------------------------------------------------------------ _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel