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: e42bd4ed09aa ("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
..
2022-04-30 10:24:21 -07:00
2022-03-25 13:35:34 -07:00
2022-04-27 09:41:54 -07:00
2022-04-06 08:47:52 -06:00
2022-05-04 11:01:31 -07:00
2022-03-23 18:03:08 -07:00
2022-03-31 13:57:15 -07:00
2022-04-08 12:59:43 -07:00
2022-03-24 18:12:09 -07:00
2022-04-22 13:11:38 -07:00
2022-04-07 06:35:34 -10:00
2022-04-27 20:36:47 +02:00
2022-04-23 09:52:07 -07:00
2022-04-23 09:46:44 -07:00
2022-03-25 13:56:18 -07:00
2022-04-24 17:25:10 +02:00
2022-03-30 10:04:11 -07:00
2022-04-07 06:35:34 -10:00
2022-03-21 14:46:01 -07:00
2022-03-30 10:50:48 -07:00
2022-04-01 09:37:18 -07:00
2022-03-27 22:18:39 +02:00
2022-04-19 10:30:43 -07:00
2022-04-28 16:51:24 +02:00
2022-04-05 10:40:52 -07:00
2022-03-31 13:57:15 -07:00
2022-04-05 10:40:52 -07:00
2022-03-31 14:14:03 -07:00