diff options
author | Thadeu Lima de Souza Cascardo <cascardo@redhat.com> | 2016-11-15 01:49:45 -0800 |
---|---|---|
committer | Pravin B Shelar <pshelar@ovn.org> | 2016-11-15 12:31:19 -0800 |
commit | 3f31aded6212b19f28026aa1a8f907c0f8e8777a (patch) | |
tree | 5b582291c3eff4f71fe6d0d930ddb30bb2a0db5d /lib | |
parent | 858c2f7655c0480c9712e6dd92b1b104d4c2d38f (diff) | |
download | openvswitch-3f31aded6212b19f28026aa1a8f907c0f8e8777a.tar.gz |
netdev: fix netmask in netdev_get_addrs
When iterating on getifaddrs result, ifa_netmask is dereferenced, but it's
already a pointer to struct sockaddr. This would result in wrong masks being
used when comparing addresses while calculating the source address given a
destination address at the routing code.
For example, the mask ::ffff:116.85.0.0 would be used, causing 172.16.100.0/24
to match 172.16.101.1, though they should not match.
This will not happen when using a dummy netdev, as netdev_get_addrs is not used
by it.
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@redhat.com>
Acked-by: Pravin B Shelar <pshelar@ovn.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/netdev.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/netdev.c b/lib/netdev.c index 6c4c6571e..ad90ef6cb 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -1913,7 +1913,7 @@ netdev_get_addrs(const char dev[], struct in6_addr **paddr, sin = ALIGNED_CAST(const struct sockaddr_in *, ifa->ifa_addr); in6_addr_set_mapped_ipv4(&addr_array[i], sin->sin_addr.s_addr); - sin = (struct sockaddr_in *) &ifa->ifa_netmask; + sin = (struct sockaddr_in *) ifa->ifa_netmask; in6_addr_set_mapped_ipv4(&mask_array[i], sin->sin_addr.s_addr); i++; } else if (family == AF_INET6) { @@ -1921,7 +1921,7 @@ netdev_get_addrs(const char dev[], struct in6_addr **paddr, sin6 = ALIGNED_CAST(const struct sockaddr_in6 *, ifa->ifa_addr); memcpy(&addr_array[i], &sin6->sin6_addr, sizeof *addr_array); - sin6 = (struct sockaddr_in6 *) &ifa->ifa_netmask; + sin6 = (struct sockaddr_in6 *) ifa->ifa_netmask; memcpy(&mask_array[i], &sin6->sin6_addr, sizeof *mask_array); i++; } |