macvlan: Check return of dev_set_allmulti
Subsystems (2)
PATCH 7/8 macvlan: Check return of dev_set_allmulti
allmulti might overflow.
Commit: "netdevice: Fix promiscuity and allmulti overflow" in net-next makes dev_set_promiscuity/allmulti return error number if overflow happened.
Here, we check the positive increment for allmulti to get error return.
--- drivers/net/macvlan.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-)
drivers/net/macvlan.c +7 -2
@@ -190,8 +190,13 @@ static int macvlan_open(struct net_device *dev) err =dev_unicast_add (lowerdev, dev->dev_addr,ETH_ALEN );if (err <0 )return err; -if (dev->flags &IFF_ALLMULTI ) -dev_set_allmulti (lowerdev,1 ); +if (dev->flags &IFF_ALLMULTI ) { + err =dev_set_allmulti (lowerdev,1 ); +if (err <0 ) { +dev_unicast_delete (lowerdev, dev->dev_addr,ETH_ALEN ); +return err; + } + }hlist_add_head_rcu (&vlan->hlist, &port->vlan_hash[dev->dev_addr[5 ]]);return 0 ;
Signature · 1 line
1.5.3.4
Quoted 18 lines · Wang Chen
allmulti might overflow.
Commit: "netdevice: Fix promiscuity and allmulti overflow" in net-next makes dev_set_promiscuity/allmulti return error number if overflow happened.Here, we check the positive increment for allmulti to get error return.
Signed-off-by Wang Chen <[email protected]>--- drivers/net/macvlan.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-)drivers/net/macvlan.c +0
-0@@ -190,8 +190,13 @@ static int macvlan_open(struct net_device *dev) err =dev_unicast_add (lowerdev, dev->dev_addr,ETH_ALEN );if (err <0 )
drivers/net/macvlan.c static int macvlan_open(struct net_device *dev) · line 199
Quoted 10 lines
drivers/net/macvlan.c +7
-2return err; -if (dev->flags &IFF_ALLMULTI ) -dev_set_allmulti (lowerdev,1 ); +if (dev->flags &IFF_ALLMULTI ) { + err =dev_set_allmulti (lowerdev,1 ); +if (err <0 ) { +dev_unicast_delete (lowerdev, dev->dev_addr,ETH_ALEN ); +return err; + } + }
Please change this to use gotos for rollback on error.
Patrick McHardy said the following on 2008-6-20 17:45:
Quoted 2 lines
Please change this to use gotos for rollback on error.
allmulti might overflow.
Commit: "netdevice: Fix promiscuity and allmulti overflow" in net-next makes dev_set_promiscuity/allmulti return error number if overflow happened.
Here, we check the positive increment for allmulti to get error return.
--- drivers/net/macvlan.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-)
drivers/net/macvlan.c +11 -3
@@ -189,12 +189,20 @@ static int macvlan_open(struct net_device *dev) err =dev_unicast_add (lowerdev, dev->dev_addr,ETH_ALEN );if (err <0 ) -return err; -if (dev->flags &IFF_ALLMULTI ) -dev_set_allmulti (lowerdev,1 ); + goto out; +if (dev->flags &IFF_ALLMULTI ) { + err =dev_set_allmulti (lowerdev,1 ); +if (err <0 ) + goto del_unicast; + }hlist_add_head_rcu (&vlan->hlist, &port->vlan_hash[dev->dev_addr[5 ]]);return 0 ; + +del_unicast: +dev_unicast_delete (lowerdev, dev->dev_addr,ETH_ALEN ); +out: +return err; }static int macvlan_stop (struct net_device *dev)
Signature · 1 line
1.5.3.4
Patrick McHardy
Acked-byQuoted 11 lines · Wang Chen
Patrick McHardy said the following on 2008-6-20 17:45:
Quoted 2 lines
Please change this to use gotos for rollback on error.
allmulti might overflow.
Commit: "netdevice: Fix promiscuity and allmulti overflow" in net-next makes dev_set_promiscuity/allmulti return error number if overflow happened.Here, we check the positive increment for allmulti to get error return.
Signed-off-by Wang Chen <[email protected]>