net: dsa: mv88e6xxx: Fix opps when adding vlan bridge
authorAndrew Lunn <andrew@lunn.ch>
Sun, 11 Dec 2016 20:07:19 +0000 (21:07 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 16 Dec 2016 18:26:50 +0000 (13:26 -0500)
A port is not necessarily assigned to a netdev. And a port does not
need to be a member of a bridge. So when iterating over all ports,
check before using the netdev and bridge_dev for a port. Otherwise we
dereference a NULL pointer.

Fixes: da9c359e19f0 ("net: dsa: mv88e6xxx: check hardware VLAN in use")
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/mv88e6xxx/chip.c

index 4da379f28d5d1b798ca09ddb0f71ca42ad18ccd0..f7222dc6581de1e75d439550520f8108b1d2744e 100644 (file)
@@ -1775,6 +1775,9 @@ static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
                        if (dsa_is_dsa_port(ds, i) || dsa_is_cpu_port(ds, i))
                                continue;
 
+                       if (!ds->ports[port].netdev)
+                               continue;
+
                        if (vlan.data[i] ==
                            GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
                                continue;
@@ -1783,6 +1786,9 @@ static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
                            chip->ports[port].bridge_dev)
                                break; /* same bridge, check next VLAN */
 
+                       if (!chip->ports[i].bridge_dev)
+                               continue;
+
                        netdev_warn(ds->ports[port].netdev,
                                    "hardware VLAN %d already used by %s\n",
                                    vlan.vid,