ip_tunnel: Don't allow to add the same tunnel multiple times.
authorSteffen Klassert <steffen.klassert@secunet.com>
Mon, 22 Sep 2014 07:11:08 +0000 (09:11 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 26 Sep 2014 04:41:30 +0000 (00:41 -0400)
When we try to add an already existing tunnel, we don't return
an error. Instead we continue and call ip_tunnel_update().
This means that we can change existing tunnels by adding
the same tunnel multiple times. It is even possible to change
the tunnel endpoints of the fallback device.

We fix this by returning an error if we try to add an existing
tunnel.

Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ip_tunnel.c

index bd41dd1948b60be01ff324b3bc78ada4318664af..bda4bb8ae2608e4543a505d8ae039fa301a8a9e6 100644 (file)
@@ -764,9 +764,14 @@ int ip_tunnel_ioctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd)
 
                t = ip_tunnel_find(itn, p, itn->fb_tunnel_dev->type);
 
-               if (!t && (cmd == SIOCADDTUNNEL)) {
-                       t = ip_tunnel_create(net, itn, p);
-                       err = PTR_ERR_OR_ZERO(t);
+               if (cmd == SIOCADDTUNNEL) {
+                       if (!t) {
+                               t = ip_tunnel_create(net, itn, p);
+                               err = PTR_ERR_OR_ZERO(t);
+                               break;
+                       }
+
+                       err = -EEXIST;
                        break;
                }
                if (dev != itn->fb_tunnel_dev && cmd == SIOCCHGTUNNEL) {