提交 dcab5e1e 编写于 作者: D David Engel 提交者: Arnaldo Carvalho de Melo

[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: NDavid Engel <gigem@comcast.net>
Signed-off-by: NArnaldo Carvalho de Melo <acme@mandriva.com>
上级 95df1c04
...@@ -715,6 +715,7 @@ int devinet_ioctl(unsigned int cmd, void __user *arg) ...@@ -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) ...@@ -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);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册