Commit 2ae0bf69 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller

[VLAN]: Return proper error codes in register_vlan_device

The returned device is unused, return proper error codes instead and avoid
having the ioctl handler guess the error.
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e89fe42c
...@@ -493,14 +493,14 @@ out_free_group: ...@@ -493,14 +493,14 @@ out_free_group:
} }
/* Attach a VLAN device to a mac address (ie Ethernet Card). /* Attach a VLAN device to a mac address (ie Ethernet Card).
* Returns the device that was created, or NULL if there was * Returns 0 if the device was created or a negative error code otherwise.
* an error of some kind.
*/ */
static struct net_device *register_vlan_device(struct net_device *real_dev, static int register_vlan_device(struct net_device *real_dev,
unsigned short VLAN_ID) unsigned short VLAN_ID)
{ {
struct net_device *new_dev; struct net_device *new_dev;
char name[IFNAMSIZ]; char name[IFNAMSIZ];
int err;
#ifdef VLAN_DEBUG #ifdef VLAN_DEBUG
printk(VLAN_DBG "%s: if_name -:%s:- vid: %i\n", printk(VLAN_DBG "%s: if_name -:%s:- vid: %i\n",
...@@ -508,10 +508,11 @@ static struct net_device *register_vlan_device(struct net_device *real_dev, ...@@ -508,10 +508,11 @@ static struct net_device *register_vlan_device(struct net_device *real_dev,
#endif #endif
if (VLAN_ID >= VLAN_VID_MASK) if (VLAN_ID >= VLAN_VID_MASK)
goto out_ret_null; return -ERANGE;
if (vlan_check_real_dev(real_dev, VLAN_ID) < 0) err = vlan_check_real_dev(real_dev, VLAN_ID);
goto out_ret_null; if (err < 0)
return err;
/* Gotta set up the fields for the device. */ /* Gotta set up the fields for the device. */
#ifdef VLAN_DEBUG #ifdef VLAN_DEBUG
...@@ -547,7 +548,7 @@ static struct net_device *register_vlan_device(struct net_device *real_dev, ...@@ -547,7 +548,7 @@ static struct net_device *register_vlan_device(struct net_device *real_dev,
vlan_setup); vlan_setup);
if (new_dev == NULL) if (new_dev == NULL)
goto out_ret_null; return -ENOBUFS;
/* need 4 bytes for extra VLAN header info, /* need 4 bytes for extra VLAN header info,
* hope the underlying device can handle it. * hope the underlying device can handle it.
...@@ -566,7 +567,8 @@ static struct net_device *register_vlan_device(struct net_device *real_dev, ...@@ -566,7 +567,8 @@ static struct net_device *register_vlan_device(struct net_device *real_dev,
VLAN_DEV_INFO(new_dev)->dent = NULL; VLAN_DEV_INFO(new_dev)->dent = NULL;
VLAN_DEV_INFO(new_dev)->flags = 1; VLAN_DEV_INFO(new_dev)->flags = 1;
if (register_vlan_dev(new_dev) < 0) err = register_vlan_dev(new_dev);
if (err < 0)
goto out_free_newdev; goto out_free_newdev;
/* Account for reference in struct vlan_dev_info */ /* Account for reference in struct vlan_dev_info */
...@@ -574,13 +576,11 @@ static struct net_device *register_vlan_device(struct net_device *real_dev, ...@@ -574,13 +576,11 @@ static struct net_device *register_vlan_device(struct net_device *real_dev,
#ifdef VLAN_DEBUG #ifdef VLAN_DEBUG
printk(VLAN_DBG "Allocated new device successfully, returning.\n"); printk(VLAN_DBG "Allocated new device successfully, returning.\n");
#endif #endif
return new_dev; return 0;
out_free_newdev: out_free_newdev:
free_netdev(new_dev); free_netdev(new_dev);
return err;
out_ret_null:
return NULL;
} }
static int vlan_device_event(struct notifier_block *unused, unsigned long event, void *ptr) static int vlan_device_event(struct notifier_block *unused, unsigned long event, void *ptr)
...@@ -753,11 +753,7 @@ static int vlan_ioctl_handler(void __user *arg) ...@@ -753,11 +753,7 @@ static int vlan_ioctl_handler(void __user *arg)
err = -EPERM; err = -EPERM;
if (!capable(CAP_NET_ADMIN)) if (!capable(CAP_NET_ADMIN))
break; break;
if (register_vlan_device(dev, args.u.VID)) { err = register_vlan_device(dev, args.u.VID);
err = 0;
} else {
err = -EINVAL;
}
break; break;
case DEL_VLAN_CMD: case DEL_VLAN_CMD:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment