diff options
author | Denis Ovsienko <infrastation@yandex.ru> | 2011-12-16 16:25:02 +0400 |
---|---|---|
committer | Denis Ovsienko <infrastation@yandex.ru> | 2012-01-02 18:36:58 +0400 |
commit | 2654e43ca2eaa8d93268c9ec85ac2dd968e5fb94 (patch) | |
tree | db36db2373e4cff83f6f7284aa8822ce5083dea6 | |
parent | d171bf58ef12ace43d48565e6870722dece1e6ed (diff) |
lib: fix type-punning in ip_masklen()
ip_masklen() was likely to return incorrect results after being compiled
with -fstrict-aliasing (-O2, -O3, -Os)
-rw-r--r-- | lib/prefix.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/prefix.c b/lib/prefix.c index 7d31af2f..580ba31a 100644 --- a/lib/prefix.c +++ b/lib/prefix.c @@ -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). */ |