mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
ipvs: fix oops in ip_vs_dst_event on rmmod
commit283283c4daupstream. After commit39f618b4fd(3.4) "ipvs: reset ipvs pointer in netns" we can oops in ip_vs_dst_event on rmmod ip_vs because ip_vs_control_cleanup is called after the ipvs_core_ops subsys is unregistered and net->ipvs is NULL. Fix it by exiting early from ip_vs_dst_event if ipvs is NULL. It is safe because all services and dests for the net are already freed. Signed-off-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: Simon Horman <horms@verge.net.au> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Acked-by: David Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e5d5ba9f15
commit
e3c418797d
@@ -1520,11 +1520,12 @@ static int ip_vs_dst_event(struct notifier_block *this, unsigned long event,
|
||||
{
|
||||
struct net_device *dev = ptr;
|
||||
struct net *net = dev_net(dev);
|
||||
struct netns_ipvs *ipvs = net_ipvs(net);
|
||||
struct ip_vs_service *svc;
|
||||
struct ip_vs_dest *dest;
|
||||
unsigned int idx;
|
||||
|
||||
if (event != NETDEV_UNREGISTER)
|
||||
if (event != NETDEV_UNREGISTER || !ipvs)
|
||||
return NOTIFY_DONE;
|
||||
IP_VS_DBG(3, "%s() dev=%s\n", __func__, dev->name);
|
||||
EnterFunction(2);
|
||||
@@ -1550,7 +1551,7 @@ static int ip_vs_dst_event(struct notifier_block *this, unsigned long event,
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry(dest, &net_ipvs(net)->dest_trash, n_list) {
|
||||
list_for_each_entry(dest, &ipvs->dest_trash, n_list) {
|
||||
__ip_vs_dev_reset(dest, dev);
|
||||
}
|
||||
mutex_unlock(&__ip_vs_mutex);
|
||||
|
||||
Reference in New Issue
Block a user