[IPV4]: Fix setting broadcast for SIOCSIFNETMASK
Fix setting of the broadcast address when the netmask is set via SIOCSIFNETMASK in Linux 2.6. The code wanted the old value of ifa->ifa_mask but used it after it had already been overwritten with the new value. Signed-off-by: David Engel <gigem@comcast.net> Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
95df1c04ab
commit
dcab5e1eec
@@ -715,6 +715,7 @@ int devinet_ioctl(unsigned int cmd, void __user *arg)
|
|||||||
break;
|
break;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
if (ifa->ifa_mask != sin->sin_addr.s_addr) {
|
if (ifa->ifa_mask != sin->sin_addr.s_addr) {
|
||||||
|
u32 old_mask = ifa->ifa_mask;
|
||||||
inet_del_ifa(in_dev, ifap, 0);
|
inet_del_ifa(in_dev, ifap, 0);
|
||||||
ifa->ifa_mask = sin->sin_addr.s_addr;
|
ifa->ifa_mask = sin->sin_addr.s_addr;
|
||||||
ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
|
ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
|
||||||
@@ -728,7 +729,7 @@ int devinet_ioctl(unsigned int cmd, void __user *arg)
|
|||||||
if ((dev->flags & IFF_BROADCAST) &&
|
if ((dev->flags & IFF_BROADCAST) &&
|
||||||
(ifa->ifa_prefixlen < 31) &&
|
(ifa->ifa_prefixlen < 31) &&
|
||||||
(ifa->ifa_broadcast ==
|
(ifa->ifa_broadcast ==
|
||||||
(ifa->ifa_local|~ifa->ifa_mask))) {
|
(ifa->ifa_local|~old_mask))) {
|
||||||
ifa->ifa_broadcast = (ifa->ifa_local |
|
ifa->ifa_broadcast = (ifa->ifa_local |
|
||||||
~sin->sin_addr.s_addr);
|
~sin->sin_addr.s_addr);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user