Message ID | 1392197311-9676-1-git-send-email-fw@strlen.de |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On Wed, 2014-02-12 at 10:28 +0100, Florian Westphal wrote: > Currently this always returns ENOBUFS, because the return value of > __ip_tunnel_create is discarded. > > A more common failure is a duplicate name (EEXIST). Propagate the real > error code so userspace can display a more meaningful error message. > > Signed-off-by: Florian Westphal <fw@strlen.de> > --- > net/ipv4/ip_tunnel.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c > index 90ff957..ef43356 100644 > --- a/net/ipv4/ip_tunnel.c > +++ b/net/ipv4/ip_tunnel.c > @@ -393,7 +393,7 @@ static struct ip_tunnel *ip_tunnel_create(struct net *net, > fbt = netdev_priv(itn->fb_tunnel_dev); > dev = __ip_tunnel_create(net, itn->fb_tunnel_dev->rtnl_link_ops, parms); > if (IS_ERR(dev)) > - return NULL; > + return (void *) dev; [...] This should be written as ERR_CAST(dev). Ben.
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index 90ff957..ef43356 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c @@ -393,7 +393,7 @@ static struct ip_tunnel *ip_tunnel_create(struct net *net, fbt = netdev_priv(itn->fb_tunnel_dev); dev = __ip_tunnel_create(net, itn->fb_tunnel_dev->rtnl_link_ops, parms); if (IS_ERR(dev)) - return NULL; + return (void *) dev; dev->mtu = ip_tunnel_bind_dev(dev); @@ -732,9 +732,13 @@ 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)) + if (!t && (cmd == SIOCADDTUNNEL)) { t = ip_tunnel_create(net, itn, p); - + if (IS_ERR(t)) { + err = PTR_ERR(t); + break; + } + } if (dev != itn->fb_tunnel_dev && cmd == SIOCCHGTUNNEL) { if (t != NULL) { if (t->dev != dev) { @@ -761,8 +765,9 @@ int ip_tunnel_ioctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd) if (t) { err = 0; ip_tunnel_update(itn, t, dev, p, true); - } else - err = (cmd == SIOCADDTUNNEL ? -ENOBUFS : -ENOENT); + } else { + err = -ENOENT; + } break; case SIOCDELTUNNEL:
Currently this always returns ENOBUFS, because the return value of __ip_tunnel_create is discarded. A more common failure is a duplicate name (EEXIST). Propagate the real error code so userspace can display a more meaningful error message. Signed-off-by: Florian Westphal <fw@strlen.de> --- net/ipv4/ip_tunnel.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)