Florian Westphal
b04df3da1b
netfilter: nf_tables: do not defer rule destruction via call_rcu
...
nf_tables_chain_destroy can sleep, it can't be used from call_rcu
callbacks.
Moreover, nf_tables_rule_release() is only safe for error unwinding,
while transaction mutex is held and the to-be-desroyed rule was not
exposed to either dataplane or dumps, as it deactives+frees without
the required synchronize_rcu() in-between.
nft_rule_expr_deactivate() callbacks will change ->use counters
of other chains/sets, see e.g. nft_lookup .deactivate callback, these
must be serialized via transaction mutex.
Also add a few lockdep asserts to make this more explicit.
Calling synchronize_rcu() isn't ideal, but fixing this without is hard
and way more intrusive. As-is, we can get:
WARNING: .. net/netfilter/nf_tables_api.c:5515 nft_set_destroy+0x..
Workqueue: events nf_tables_trans_destroy_work
RIP: 0010:nft_set_destroy+0x3fe/0x5c0
Call Trace:
<TASK>
nf_tables_trans_destroy_work+0x6b7/0xad0
process_one_work+0x64a/0xce0
worker_thread+0x613/0x10d0
In case the synchronize_rcu becomes an issue, we can explore alternatives.
One way would be to allocate nft_trans_rule objects + one nft_trans_chain
object, deactivate the rules + the chain and then defer the freeing to the
nft destroy workqueue. We'd still need to keep the synchronize_rcu path as
a fallback to handle -ENOMEM corner cases though.
Reported-by: syzbot+b26935466701e56cfdc2@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/all/67478d92.050a0220.253251.0062.GAE@google.com/T/
Fixes: c03d278fdf ("netfilter: nf_tables: wait for rcu grace period on net_device removal")
Signed-off-by: Florian Westphal <fw@strlen.de >
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org >
2024-12-11 23:27:50 +01:00
..
2024-12-04 15:39:22 +01:00
2024-11-28 13:14:23 +01:00
2024-09-06 18:10:21 -07:00
2024-01-29 15:43:21 +01:00
2024-07-01 17:03:01 +02:00
2024-11-14 12:39:50 +01:00
2024-08-19 18:44:51 +02:00
2022-02-04 06:30:28 +01:00
2019-07-16 13:16:59 +02:00
2024-05-22 15:00:56 -07:00
2023-11-08 13:52:32 +01:00
2024-09-26 13:03:03 +02:00
2023-02-22 00:28:47 +01:00
2024-02-21 11:57:11 +01:00
2023-09-13 21:57:50 +02:00
2022-09-20 23:50:03 +02:00
2024-03-07 03:10:35 +01:00
2022-08-11 16:50:49 +02:00
2019-06-19 17:09:52 +02:00
2023-10-10 16:34:28 +02:00
2022-09-07 15:55:23 +02:00
2023-10-24 13:16:30 +02:00
2022-01-11 10:41:44 +01:00
2024-10-10 08:30:21 -07:00
2023-03-08 14:25:41 +01:00
2022-07-11 16:25:15 +02:00
2024-05-06 11:13:56 +02:00
2019-06-19 17:09:55 +02:00
2023-07-05 14:42:15 +02:00
2021-06-18 14:47:43 +02:00
2024-05-06 11:13:56 +02:00
2024-01-31 23:13:57 +01:00
2024-10-02 17:23:23 -04:00
2023-02-01 12:18:51 +01:00
2023-11-08 13:52:32 +01:00
2022-08-11 16:50:25 +02:00
2022-02-04 06:30:28 +01:00
2023-06-26 17:18:48 +02:00
2019-05-30 11:26:32 -07:00
2024-07-24 20:59:29 +02:00
2019-07-16 13:16:59 +02:00
2022-07-11 16:25:15 +02:00
2022-02-04 06:30:28 +01:00
2022-06-21 10:50:41 +02:00
2024-07-01 17:03:01 +02:00
2024-09-12 15:41:03 +02:00
2024-09-12 15:41:03 +02:00
2024-08-22 12:14:18 +02:00
2024-08-14 23:37:16 +02:00
2022-07-11 16:25:14 +02:00
2024-07-01 17:01:53 +02:00
2024-07-24 20:59:29 +02:00
2024-06-19 18:41:59 +02:00
2024-01-17 12:02:48 +01:00
2024-07-24 20:59:29 +02:00
2022-09-07 16:46:04 +02:00
2024-01-31 20:40:56 -08:00
2024-11-11 10:32:06 -08:00
2022-09-07 16:46:04 +02:00
2022-11-18 02:15:15 +01:00
2022-09-07 16:46:04 +02:00
2022-05-13 18:56:27 +02:00
2024-01-03 11:17:17 +01:00
2023-10-30 14:36:57 -07:00
2023-11-08 16:40:30 +01:00
2022-09-07 16:46:04 +02:00
2019-07-16 13:16:59 +02:00
2024-02-21 12:03:22 +01:00
2020-07-24 15:41:54 -07:00
2024-10-02 17:23:23 -04:00
2024-12-11 23:27:50 +01:00
2024-08-20 12:37:25 +02:00
2024-06-25 20:40:47 +02:00
2024-06-12 14:33:38 -07:00
2021-05-29 01:04:53 +02:00
2022-07-11 16:25:15 +02:00
2024-06-26 00:54:53 +02:00
2023-04-21 11:34:14 -07:00
2024-01-17 12:02:47 +01:00
2023-11-08 13:52:32 +01:00
2024-08-19 18:44:50 +02:00
2024-11-14 12:39:40 +01:00
2024-11-15 12:07:04 +01:00
2024-10-02 17:23:23 -04:00
2024-05-06 11:13:55 +02:00
2023-11-08 13:52:32 +01:00
2021-05-29 01:04:54 +02:00
2024-08-20 12:37:24 +02:00
2024-09-26 13:03:02 +02:00
2024-05-10 11:13:45 +02:00
2024-09-03 10:47:16 +02:00
2023-05-03 13:49:08 +02:00
2024-08-20 12:37:24 +02:00
2024-08-20 12:37:24 +02:00
2024-09-03 18:19:44 +02:00
2024-10-02 17:23:23 -04:00
2022-03-20 00:29:47 +01:00
2022-03-20 00:29:47 +01:00
2024-09-03 10:47:17 +02:00
2024-11-15 11:00:29 +01:00
2024-09-03 10:47:17 +02:00
2024-08-20 12:37:24 +02:00
2024-09-03 10:47:17 +02:00
2024-12-03 22:10:58 +01:00
2024-05-10 11:13:45 +02:00
2024-05-10 11:13:45 +02:00
2024-09-26 13:03:02 +02:00
2024-09-03 10:47:17 +02:00
2024-09-03 10:47:17 +02:00
2024-09-26 13:03:02 +02:00
2024-09-03 10:47:17 +02:00
2024-09-26 13:03:02 +02:00
2024-08-20 12:37:24 +02:00
2024-09-03 10:47:17 +02:00
2024-10-31 10:54:49 +01:00
2024-09-03 10:47:17 +02:00
2024-05-10 11:13:45 +02:00
2024-08-20 12:37:24 +02:00
2024-09-03 10:47:17 +02:00
2024-09-03 10:47:17 +02:00
2024-09-03 10:47:17 +02:00
2024-09-03 10:47:17 +02:00
2024-09-03 10:47:17 +02:00
2024-11-05 22:06:22 +01:00
2024-12-04 21:37:41 +01:00
2024-07-24 10:01:59 +02:00
2021-05-29 01:04:27 +02:00
2024-09-26 13:03:02 +02:00
2024-07-17 19:00:47 +02:00
2024-04-17 17:43:11 +02:00
2024-11-28 13:14:24 +01:00
2024-09-03 10:47:17 +02:00
2024-09-03 10:47:17 +02:00
2024-11-11 10:32:06 -08:00
2024-09-03 10:47:17 +02:00
2024-02-21 12:03:22 +01:00
2024-10-30 13:17:36 +01:00
2024-10-09 23:20:46 +02:00
2021-06-01 23:53:51 +02:00
2021-08-17 00:45:07 +02:00
2019-06-19 17:09:55 +02:00
2024-10-09 23:20:46 +02:00
2024-10-09 23:20:46 +02:00
2024-10-09 23:20:46 +02:00
2019-05-21 10:50:45 +02:00
2024-10-09 23:20:46 +02:00
2019-06-19 17:09:55 +02:00
2024-10-09 23:20:46 +02:00
2024-10-09 23:20:46 +02:00
2024-10-09 23:20:46 +02:00
2019-06-19 17:09:55 +02:00
2019-06-19 17:09:55 +02:00
2024-10-09 23:20:46 +02:00
2019-06-19 17:09:55 +02:00
2019-06-19 17:09:55 +02:00
2019-06-19 17:09:55 +02:00
2022-07-11 16:40:45 +02:00
2019-06-19 17:09:55 +02:00
2019-06-19 17:09:55 +02:00
2022-01-22 08:33:37 +02:00
2019-06-19 17:09:55 +02:00
2019-06-19 17:09:55 +02:00
2019-06-22 08:59:24 -04:00
2020-08-28 19:55:51 +02:00
2024-12-11 23:15:19 +01:00
2019-05-30 11:26:32 -07:00
2019-06-25 01:32:59 +02:00
2019-05-21 10:50:45 +02:00
2019-06-19 17:09:55 +02:00
2024-11-28 13:14:24 +01:00
2023-02-22 21:25:23 -08:00
2021-05-29 01:04:52 +02:00
2021-09-21 03:46:56 +02:00
2019-06-19 17:09:55 +02:00
2024-10-21 11:31:26 +02:00
2019-06-19 17:09:55 +02:00
2019-06-19 17:09:55 +02:00
2020-06-25 00:50:31 +02:00
2019-06-19 17:09:55 +02:00
2020-12-01 09:45:29 +01:00
2024-10-21 11:31:26 +02:00
2019-06-19 17:09:55 +02:00
2023-06-20 22:43:42 +02:00
2023-12-06 17:52:15 +01:00
2024-01-17 12:02:48 +01:00
2019-06-19 17:09:55 +02:00
2019-06-19 17:09:55 +02:00
2019-05-21 10:50:45 +02:00
2019-06-19 17:09:55 +02:00
2024-10-09 23:20:46 +02:00
2019-06-19 17:09:55 +02:00
2024-06-28 17:57:50 +02:00
2023-03-22 21:48:59 +01:00
2023-08-22 15:13:21 +02:00
2023-08-30 17:34:01 +02:00
2024-10-09 23:20:46 +02:00
2019-08-13 12:14:26 +02:00
2023-07-29 18:13:41 +01:00
2019-06-19 17:09:55 +02:00
2022-10-11 17:42:58 -06:00
2019-06-19 17:09:55 +02:00
2019-06-19 17:09:55 +02:00
2022-07-11 16:40:45 +02:00
2019-06-22 08:59:24 -04:00
2023-03-22 21:48:59 +01:00
2019-05-21 11:28:40 +02:00
2020-07-29 20:09:18 +02:00
2022-07-21 00:56:00 +02:00
2024-10-21 11:31:26 +02:00
2023-08-30 17:34:01 +02:00