mirror of
https://github.com/openvswitch/ovs
synced 2025-09-02 15:25:22 +00:00
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>
This commit is contained in:
committed by
Pravin B Shelar
parent
858c2f7655
commit
3f31aded62
@@ -1913,7 +1913,7 @@ netdev_get_addrs(const char dev[], struct in6_addr **paddr,
|
|||||||
|
|
||||||
sin = ALIGNED_CAST(const struct sockaddr_in *, ifa->ifa_addr);
|
sin = ALIGNED_CAST(const struct sockaddr_in *, ifa->ifa_addr);
|
||||||
in6_addr_set_mapped_ipv4(&addr_array[i], sin->sin_addr.s_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);
|
in6_addr_set_mapped_ipv4(&mask_array[i], sin->sin_addr.s_addr);
|
||||||
i++;
|
i++;
|
||||||
} else if (family == AF_INET6) {
|
} 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);
|
sin6 = ALIGNED_CAST(const struct sockaddr_in6 *, ifa->ifa_addr);
|
||||||
memcpy(&addr_array[i], &sin6->sin6_addr, sizeof *addr_array);
|
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);
|
memcpy(&mask_array[i], &sin6->sin6_addr, sizeof *mask_array);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user