diff options
author | Wang Chen <wangchen@cn.fujitsu.com> | 2008-06-18 04:48:28 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-06-18 04:48:28 -0400 |
commit | dad9b335c6940de2746a9788eb456d09cf102f81 (patch) | |
tree | c74092de70d7c2c9ba88bf580bc404133b55c490 /include/linux/netdevice.h | |
parent | dd574dbfcc9e74e7dd8fd59ae0075d23e71a3da1 (diff) |
netdevice: Fix promiscuity and allmulti overflow
Max of promiscuity and allmulti plus positive @inc can cause overflow.
Fox example: when allmulti=0xFFFFFFFF, any caller give dev_set_allmulti() a
positive @inc will cause allmulti be off.
This is not what we want, though it's rare case.
The fix is that only negative @inc will cause allmulti or promiscuity be off
and when any caller makes the counters touch the roof, we return error.
Change of v2:
Change void function dev_set_promiscuity/allmulti to return int.
So callers can get the overflow error.
Caller's fix will be done later.
Change of v3:
1. Since we return error to caller, we don't need to print KERN_ERROR,
KERN_WARNING is enough.
2. In dev_set_promiscuity(), if __dev_set_promiscuity() failed, we
return at once.
Signed-off-by: Wang Chen <wangchen@cn.fujitsu.com>
Acked-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/netdevice.h')
-rw-r--r-- | include/linux/netdevice.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 4bf613cd9e2d..45dce2b58d4c 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -1476,8 +1476,8 @@ extern int __dev_addr_delete(struct dev_addr_list **list, int *count, void *ad | |||
1476 | extern int __dev_addr_add(struct dev_addr_list **list, int *count, void *addr, int alen, int newonly); | 1476 | extern int __dev_addr_add(struct dev_addr_list **list, int *count, void *addr, int alen, int newonly); |
1477 | extern int __dev_addr_sync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count); | 1477 | extern int __dev_addr_sync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count); |
1478 | extern void __dev_addr_unsync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count); | 1478 | extern void __dev_addr_unsync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count); |
1479 | extern void dev_set_promiscuity(struct net_device *dev, int inc); | 1479 | extern int dev_set_promiscuity(struct net_device *dev, int inc); |
1480 | extern void dev_set_allmulti(struct net_device *dev, int inc); | 1480 | extern int dev_set_allmulti(struct net_device *dev, int inc); |
1481 | extern void netdev_state_change(struct net_device *dev); | 1481 | extern void netdev_state_change(struct net_device *dev); |
1482 | extern void netdev_bonding_change(struct net_device *dev); | 1482 | extern void netdev_bonding_change(struct net_device *dev); |
1483 | extern void netdev_features_change(struct net_device *dev); | 1483 | extern void netdev_features_change(struct net_device *dev); |