OSDN Git Service

dpaa2-switch: check if the port priv is valid
authorIoana Ciornei <ioana.ciornei@nxp.com>
Thu, 6 Jan 2022 13:59:05 +0000 (15:59 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 7 Jan 2022 03:49:10 +0000 (19:49 -0800)
Before accessing the port private structure make sure that there is
still a non-NULL pointer there. A NULL pointer access can happen when we
are on the remove path, some switch ports are unregistered and some are
in the process of unregistering.

Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c

index d039457..9b5512b 100644 (file)
@@ -394,7 +394,8 @@ static int dpaa2_switch_dellink(struct ethsw_core *ethsw, u16 vid)
 
        for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
                ppriv_local = ethsw->ports[i];
-               ppriv_local->vlans[vid] = 0;
+               if (ppriv_local)
+                       ppriv_local->vlans[vid] = 0;
        }
 
        return 0;
@@ -1896,9 +1897,11 @@ static int dpaa2_switch_port_del_vlan(struct ethsw_port_priv *port_priv, u16 vid
                /* Delete VLAN from switch if it is no longer configured on
                 * any port
                 */
-               for (i = 0; i < ethsw->sw_attr.num_ifs; i++)
-                       if (ethsw->ports[i]->vlans[vid] & ETHSW_VLAN_MEMBER)
+               for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
+                       if (ethsw->ports[i] &&
+                           ethsw->ports[i]->vlans[vid] & ETHSW_VLAN_MEMBER)
                                return 0; /* Found a port member in VID */
+               }
 
                ethsw->vlans[vid] &= ~ETHSW_VLAN_GLOBAL;