ipv4: Fix erroneous uses of ifa_address.
In usual cases ifa_address == ifa_local, but in the case where SIOCSIFDSTADDR sets the destination address on a point-to-point link, ifa_address gets set to that destination address. Therefore we should use ifa_local when we want the local interface address. There were two cases where the selection was done incorrectly: 1) When devinet_ioctl() does matching, it checks ifa_address even though gifconf correct reported ifa_local to the user 2) IN_DEV_ARP_NOTIFY handling sends a gratuitous ARP using ifa_address instead of ifa_local. Reported-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e380688217
commit
6c91afe1a9
1 changed files with 3 additions and 3 deletions
|
@ -670,7 +670,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
|
|||
ifap = &ifa->ifa_next) {
|
||||
if (!strcmp(ifr.ifr_name, ifa->ifa_label) &&
|
||||
sin_orig.sin_addr.s_addr ==
|
||||
ifa->ifa_address) {
|
||||
ifa->ifa_local) {
|
||||
break; /* found */
|
||||
}
|
||||
}
|
||||
|
@ -1040,8 +1040,8 @@ static void inetdev_send_gratuitous_arp(struct net_device *dev,
|
|||
return;
|
||||
|
||||
arp_send(ARPOP_REQUEST, ETH_P_ARP,
|
||||
ifa->ifa_address, dev,
|
||||
ifa->ifa_address, NULL,
|
||||
ifa->ifa_local, dev,
|
||||
ifa->ifa_local, NULL,
|
||||
dev->dev_addr, NULL);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue