summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2009-11-17 06:45:04 -0800
committerDavid S. Miller <davem@davemloft.net>2009-11-17 06:45:04 -0800
commit6b863d1d3239eff0f45c2e6e672f5b56db828db0 (patch)
tree8384f6f29891d684725015e1dad5a96e6d9fb8fc /net
parent69c0cab120a85471054614418b447349caba22d7 (diff)
downloadlinux-3.10-6b863d1d3239eff0f45c2e6e672f5b56db828db0.tar.gz
linux-3.10-6b863d1d3239eff0f45c2e6e672f5b56db828db0.tar.bz2
linux-3.10-6b863d1d3239eff0f45c2e6e672f5b56db828db0.zip
vlan: Fix register_vlan_dev() error path
In case register_netdevice() returns an error, and a new vlan_group was allocated and inserted in vlan_group_hash[] we call vlan_group_free() without deleting group from hash table. Future lookups can give infinite loops or crashes. We must delete the vlan_group using RCU safe procedure. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/8021q/vlan.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index 8836575f9d7..a29c5ab5815 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -281,8 +281,11 @@ out_uninit_applicant:
if (ngrp)
vlan_gvrp_uninit_applicant(real_dev);
out_free_group:
- if (ngrp)
- vlan_group_free(ngrp);
+ if (ngrp) {
+ hlist_del_rcu(&ngrp->hlist);
+ /* Free the group, after all cpu's are done. */
+ call_rcu(&ngrp->rcu, vlan_rcu_free);
+ }
return err;
}