ip_tunnel: use the right netns in ioctl handler

Because the netdevice may be in another netns than the i/o netns, we should
use the i/o netns instead of dev_net(dev).

The variable 'tunnel' was used only to get 'itn', hence to simplify code I
remove it and use 't' instead.

Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Nicolas Dichtel 2014-04-16 11:19:32 +02:00 committed by David S. Miller
parent b7c0ddf5f2
commit 8c923ce219
1 changed files with 7 additions and 8 deletions

View File

@ -722,19 +722,18 @@ static void ip_tunnel_update(struct ip_tunnel_net *itn,
int ip_tunnel_ioctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd) int ip_tunnel_ioctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd)
{ {
int err = 0; int err = 0;
struct ip_tunnel *t; struct ip_tunnel *t = netdev_priv(dev);
struct net *net = dev_net(dev); struct net *net = t->net;
struct ip_tunnel *tunnel = netdev_priv(dev); struct ip_tunnel_net *itn = net_generic(net, t->ip_tnl_net_id);
struct ip_tunnel_net *itn = net_generic(net, tunnel->ip_tnl_net_id);
BUG_ON(!itn->fb_tunnel_dev); BUG_ON(!itn->fb_tunnel_dev);
switch (cmd) { switch (cmd) {
case SIOCGETTUNNEL: case SIOCGETTUNNEL:
t = NULL; if (dev == itn->fb_tunnel_dev) {
if (dev == itn->fb_tunnel_dev)
t = ip_tunnel_find(itn, p, itn->fb_tunnel_dev->type); t = ip_tunnel_find(itn, p, itn->fb_tunnel_dev->type);
if (t == NULL) if (t == NULL)
t = netdev_priv(dev); t = netdev_priv(dev);
}
memcpy(p, &t->parms, sizeof(*p)); memcpy(p, &t->parms, sizeof(*p));
break; break;