| From 10203c14d608d8ca3ebdc04f52bf3e90efcb72a6 Mon Sep 17 00:00:00 2001 |
| From: Florian Fainelli <f.fainelli@gmail.com> |
| Date: Thu, 16 Sep 2021 14:33:35 -0700 |
| Subject: [PATCH] net: dsa: bcm_sf2: Fix array overrun in bcm_sf2_num_active_ports() |
| Git-commit: 02319bf15acf54004216e40ac9c171437f24be24 |
| Patch-mainline: v5.15-rc3 |
| References: stable-5.14.7 |
| |
| commit 02319bf15acf54004216e40ac9c171437f24be24 upstream. |
| |
| After d12e1c464988 ("net: dsa: b53: Set correct number of ports in the |
| DSA struct") we stopped setting dsa_switch::num_ports to DSA_MAX_PORTS, |
| which created an off by one error between the statically allocated |
| bcm_sf2_priv::port_sts array (of size DSA_MAX_PORTS). When |
| dsa_is_cpu_port() is used, we end-up accessing an out of bounds member |
| and causing a NPD. |
| |
| Fix this by iterating with the appropriate port count using |
| ds->num_ports. |
| |
| Fixes: d12e1c464988 ("net: dsa: b53: Set correct number of ports in the DSA struct") |
| Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Acked-by: Takashi Iwai <tiwai@suse.de> |
| |
| |
| drivers/net/dsa/bcm_sf2.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c |
| index 6ce9ec1283e0..b6c4b3adb171 100644 |
| |
| |
| @@ -68,7 +68,7 @@ static unsigned int bcm_sf2_num_active_ports(struct dsa_switch *ds) |
| struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); |
| unsigned int port, count = 0; |
| |
| - for (port = 0; port < ARRAY_SIZE(priv->port_sts); port++) { |
| + for (port = 0; port < ds->num_ports; port++) { |
| if (dsa_is_cpu_port(ds, port)) |
| continue; |
| if (priv->port_sts[port].enabled) |
| -- |
| 2.26.2 |
| |