[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: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
e89fe42cd0
commit
2ae0bf69b7
@@ -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,
|
|||||||
#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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
#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)
|
|||||||
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:
|
||||||
|
Reference in New Issue
Block a user