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

Reply via email to