Skip to content

Commit

Permalink
[VLAN]: Return proper error codes in register_vlan_device
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Patrick McHardy authored and David S. Miller committed Jul 11, 2007
1 parent e89fe42 commit 2ae0bf6
Showing 1 changed file with 14 additions and 18 deletions.
32 changes: 14 additions & 18 deletions net/8021q/vlan.c
Original file line number Diff line number Diff line change
Expand Up @@ -493,25 +493,26 @@ static int register_vlan_dev(struct net_device *dev)
}

/* Attach a VLAN device to a mac address (ie Ethernet Card).
* Returns the device that was created, or NULL if there was
* an error of some kind.
* Returns 0 if the device was created or a negative error code otherwise.
*/
static struct net_device *register_vlan_device(struct net_device *real_dev,
unsigned short VLAN_ID)
static int register_vlan_device(struct net_device *real_dev,
unsigned short VLAN_ID)
{
struct net_device *new_dev;
char name[IFNAMSIZ];
int err;

#ifdef VLAN_DEBUG
printk(VLAN_DBG "%s: if_name -:%s:- vid: %i\n",
__FUNCTION__, eth_IF_name, VLAN_ID);
#endif

if (VLAN_ID >= VLAN_VID_MASK)
goto out_ret_null;
return -ERANGE;

if (vlan_check_real_dev(real_dev, VLAN_ID) < 0)
goto out_ret_null;
err = vlan_check_real_dev(real_dev, VLAN_ID);
if (err < 0)
return err;

/* Gotta set up the fields for the device. */
#ifdef VLAN_DEBUG
Expand Down Expand Up @@ -547,7 +548,7 @@ static struct net_device *register_vlan_device(struct net_device *real_dev,
vlan_setup);

if (new_dev == NULL)
goto out_ret_null;
return -ENOBUFS;

/* need 4 bytes for extra VLAN header info,
* hope the underlying device can handle it.
Expand All @@ -566,21 +567,20 @@ static struct net_device *register_vlan_device(struct net_device *real_dev,
VLAN_DEV_INFO(new_dev)->dent = NULL;
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;

/* Account for reference in struct vlan_dev_info */
dev_hold(real_dev);
#ifdef VLAN_DEBUG
printk(VLAN_DBG "Allocated new device successfully, returning.\n");
#endif
return new_dev;
return 0;

out_free_newdev:
free_netdev(new_dev);

out_ret_null:
return NULL;
return err;
}

static int vlan_device_event(struct notifier_block *unused, unsigned long event, void *ptr)
Expand Down Expand Up @@ -753,11 +753,7 @@ static int vlan_ioctl_handler(void __user *arg)
err = -EPERM;
if (!capable(CAP_NET_ADMIN))
break;
if (register_vlan_device(dev, args.u.VID)) {
err = 0;
} else {
err = -EINVAL;
}
err = register_vlan_device(dev, args.u.VID);
break;

case DEL_VLAN_CMD:
Expand Down

0 comments on commit 2ae0bf6

Please sign in to comment.