]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: fix type-punning in ip_masklen()
authorDenis Ovsienko <infrastation@yandex.ru>
Fri, 16 Dec 2011 12:25:02 +0000 (16:25 +0400)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 2 Jan 2012 14:36:58 +0000 (18:36 +0400)
ip_masklen() was likely to return incorrect results after being compiled
with -fstrict-aliasing (-O2, -O3, -Os)

lib/prefix.c

index 7d31af2f8a2f45cc39ad82357ecf514aa367223b..580ba31a4e41ba1a900439f21943e500bbd2b332 100644 (file)
@@ -2592,8 +2592,13 @@ masklen2ip (const int masklen, struct in_addr *netmask)
 u_char
 ip_masklen (struct in_addr netmask)
 {
-  u_int16_t * int16 = (u_int16_t *) &netmask.s_addr;
-  return map64kto17_nbo[int16[0]] + map64kto17_nbo[int16[1]];
+  union
+  {
+    u_int32_t int32;
+    u_int16_t int16[2];
+  } u;
+  u.int32 = netmask.s_addr;
+  return map64kto17_nbo[u.int16[0]] + map64kto17_nbo[u.int16[1]];
 }
 
 /* Apply mask to IPv4 prefix (network byte order). */