OSDN Git Service

ip_tunnel: use the right netns in ioctl handler
authorNicolas Dichtel <nicolas.dichtel@6wind.com>
Wed, 16 Apr 2014 09:19:32 +0000 (11:19 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 Apr 2014 19:16:02 +0000 (15:16 -0400)
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>
net/ipv4/ip_tunnel.c

index 484d0ce..fa5b751 100644 (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 err = 0;
-       struct ip_tunnel *t;
-       struct net *net = dev_net(dev);
-       struct ip_tunnel *tunnel = netdev_priv(dev);
-       struct ip_tunnel_net *itn = net_generic(net, tunnel->ip_tnl_net_id);
+       struct ip_tunnel *t = netdev_priv(dev);
+       struct net *net = t->net;
+       struct ip_tunnel_net *itn = net_generic(net, t->ip_tnl_net_id);
 
        BUG_ON(!itn->fb_tunnel_dev);
        switch (cmd) {
        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);
-               if (t == NULL)
-                       t = netdev_priv(dev);
+                       if (t == NULL)
+                               t = netdev_priv(dev);
+               }
                memcpy(p, &t->parms, sizeof(*p));
                break;