]> git.baikalelectronics.ru Git - kernel.git/commit
net: dsa: fix panic on shutdown if multi-chip tree failed to probe
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 18 Mar 2022 19:54:43 +0000 (21:54 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Apr 2022 12:23:43 +0000 (14:23 +0200)
commitc74e7f0a08f6084328d731a423b8763476566b4a
treedd2b3993106bc44f245c3d38c16b66a68adb5465
parent692d16874b0b3db624eee72d8bc629d76c896228
net: dsa: fix panic on shutdown if multi-chip tree failed to probe

[ Upstream commit 09c2ba9507621ccab3fb9dbb3ed103f3635cb627 ]

DSA probing is atypical because a tree of devices must probe all at
once, so out of N switches which call dsa_tree_setup_routing_table()
during probe, for (N - 1) of them, "complete" will return false and they
will exit probing early. The Nth switch will set up the whole tree on
their behalf.

The implication is that for (N - 1) switches, the driver binds to the
device successfully, without doing anything. When the driver is bound,
the ->shutdown() method may run. But if the Nth switch has failed to
initialize the tree, there is nothing to do for the (N - 1) driver
instances, since the slave devices have not been created, etc. Moreover,
dsa_switch_shutdown() expects that the calling @ds has been in fact
initialized, so it jumps at dereferencing the various data structures,
which is incorrect.

Avoid the ensuing NULL pointer dereferences by simply checking whether
the Nth switch has previously set "ds->setup = true" for the switch
which is currently shutting down. The entire setup is serialized under
dsa2_mutex which we already hold.

Fixes: db3f4e7cb878 ("net: dsa: be compatible with masters which unregister on shutdown")
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Link: https://lore.kernel.org/r/20220318195443.275026-1-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/dsa/dsa2.c