linux/drivers/net/ethernet/mscc
Vladimir Oltean e1846cff2f net: mscc: ocelot: mark traps with a bool instead of keeping them in a list
Since the blamed commit, VCAP filters can appear on more than one list.
If their action is "trap", they are chained on ocelot->traps via
filter->trap_list. This is in addition to their normal placement on the
VCAP block->rules list head.

Therefore, when we free a VCAP filter, we must remove it from all lists
it is a member of, including ocelot->traps.

There are at least 2 bugs which are direct consequences of this design
decision.

First is the incorrect usage of list_empty(), meant to denote whether
"filter" is chained into ocelot->traps via filter->trap_list.
This does not do the correct thing, because list_empty() checks whether
"head->next == head", but in our case, head->next == head->prev == NULL.
So we dereference NULL pointers and die when we call list_del().

Second is the fact that not all places that should remove the filter
from ocelot->traps do so. One example is ocelot_vcap_block_remove_filter(),
which is where we have the main kfree(filter). By keeping freed filters
in ocelot->traps we end up in a use-after-free in
felix_update_trapping_destinations().

Attempting to fix all the buggy patterns is a whack-a-mole game which
makes the driver unmaintainable. Actually this is what the previous
patch version attempted to do:
https://patchwork.kernel.org/project/netdevbpf/patch/20220503115728.834457-3-vladimir.oltean@nxp.com/

but it introduced another set of bugs, because there are other places in
which create VCAP filters, not just ocelot_vcap_filter_create():

- ocelot_trap_add()
- felix_tag_8021q_vlan_add_rx()
- felix_tag_8021q_vlan_add_tx()

Relying on the convention that all those code paths must call
INIT_LIST_HEAD(&filter->trap_list) is not going to scale.

So let's do what should have been done in the first place and keep a
bool in struct ocelot_vcap_filter which denotes whether we are looking
at a trapping rule or not. Iterating now happens over the main VCAP IS2
block->rules. The advantage is that we no longer risk having stale
references to a freed filter, since it is only present in that list.

Fixes: e42bd4ed09 ("net: mscc: ocelot: keep traps in a list")
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2022-05-05 19:15:14 -07:00
..
Kconfig of: net: move of_net under net/ 2021-10-07 13:39:51 +01:00
Makefile net: ocelot: add FDMA support 2021-12-10 20:56:58 -08:00
ocelot.c net: mscc: ocelot: mark traps with a bool instead of keeping them in a list 2022-05-05 19:15:14 -07:00
ocelot.h net: mscc: ocelot: offload per-flow mirroring using tc-mirred and VCAP IS2 2022-03-17 17:42:47 -07:00
ocelot_devlink.c net: update NXP copyright text 2021-09-17 13:52:17 +01:00
ocelot_fdma.c net: ocelot: use dma_unmap_addr to get tx buffer dma_addr 2021-12-13 14:51:21 +00:00
ocelot_fdma.h net: ocelot: add FDMA support 2021-12-10 20:56:58 -08:00
ocelot_flower.c net: mscc: ocelot: mark traps with a bool instead of keeping them in a list 2022-05-05 19:15:14 -07:00
ocelot_io.c net: mscc: ocelot: add ability to perform bulk reads 2022-02-14 13:24:29 +00:00
ocelot_mrp.c net: mscc: ocelot: enforce FDB isolation when VLAN-unaware 2022-02-27 11:06:14 +00:00
ocelot_net.c net: mscc: ocelot: add port mirroring support using tc-matchall 2022-03-17 17:42:46 -07:00
ocelot_police.c flow_offload: reject offload for all drivers with invalid police parameters 2022-02-28 11:12:20 +00:00
ocelot_police.h flow_offload: reject offload for all drivers with invalid police parameters 2022-02-28 11:12:20 +00:00
ocelot_ptp.c time64.h: Consolidated PSEC_PER_SEC definition 2021-04-06 16:32:17 -07:00
ocelot_qs.h
ocelot_rew.h
ocelot_vcap.c net: mscc: ocelot: offload per-flow mirroring using tc-mirred and VCAP IS2 2022-03-17 17:42:47 -07:00
ocelot_vcap.h net: dsa: felix: perform switch setup for tag_8021q 2021-01-29 21:25:27 -08:00
ocelot_vsc7514.c net: ocelot: add FDMA support 2021-12-10 20:56:58 -08:00
vsc7514_regs.c net: mscc: ocelot: split register definitions to a separate file 2021-12-07 21:44:49 -08:00