Skip to content

Commit

Permalink
net: vlan: Avoid using BUG() in vlan_proto_idx()
Browse files Browse the repository at this point in the history
While we should always make sure that we specify a valid VLAN protocol
to vlan_proto_idx(), killing the machine when an invalid value is
specified is too harsh and not helpful for debugging. All callers are
capable of dealing with an error returned by vlan_proto_idx() so check
the index value and propagate it accordingly.

Signed-off-by: Florian Fainelli <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
ffainelli authored and davem330 committed Sep 25, 2020
1 parent 7806f65 commit d018684
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 6 deletions.
3 changes: 3 additions & 0 deletions net/8021q/vlan.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ static int vlan_group_prealloc_vid(struct vlan_group *vg,
ASSERT_RTNL();

pidx = vlan_proto_idx(vlan_proto);
if (pidx < 0)
return -EINVAL;

vidx = vlan_id / VLAN_GROUP_ARRAY_PART_LEN;
array = vg->vlan_devices_arrays[pidx][vidx];
if (array != NULL)
Expand Down
19 changes: 13 additions & 6 deletions net/8021q/vlan.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,16 @@ struct vlan_info {
struct rcu_head rcu;
};

static inline unsigned int vlan_proto_idx(__be16 proto)
static inline int vlan_proto_idx(__be16 proto)
{
switch (proto) {
case htons(ETH_P_8021Q):
return VLAN_PROTO_8021Q;
case htons(ETH_P_8021AD):
return VLAN_PROTO_8021AD;
default:
BUG();
return 0;
WARN(1, "invalid VLAN protocol: 0x%04x\n", ntohs(proto));
return -EINVAL;
}
}

Expand All @@ -64,17 +64,24 @@ static inline struct net_device *vlan_group_get_device(struct vlan_group *vg,
__be16 vlan_proto,
u16 vlan_id)
{
return __vlan_group_get_device(vg, vlan_proto_idx(vlan_proto), vlan_id);
int pidx = vlan_proto_idx(vlan_proto);

if (pidx < 0)
return NULL;

return __vlan_group_get_device(vg, pidx, vlan_id);
}

static inline void vlan_group_set_device(struct vlan_group *vg,
__be16 vlan_proto, u16 vlan_id,
struct net_device *dev)
{
int pidx = vlan_proto_idx(vlan_proto);
struct net_device **array;
if (!vg)

if (!vg || pidx < 0)
return;
array = vg->vlan_devices_arrays[vlan_proto_idx(vlan_proto)]
array = vg->vlan_devices_arrays[pidx]
[vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] = dev;
}
Expand Down

0 comments on commit d018684

Please sign in to comment.