[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20240705104821.3202-1-hdanton@sina.com>
Date: Fri, 5 Jul 2024 18:48:21 +0800
From: Hillf Danton <hdanton@...a.com>
To: Florian Westphal <fw@...len.de>
Cc: netfilter-devel@...r.kernel.org,
linux-kernel@...r.kernel.org,
netdev@...r.kernel.org,
syzkaller-bugs@...glegroups.com,
syzbot+4fd66a69358fc15ae2ad@...kaller.appspotmail.com
Subject: Re: [PATCH nf] netfilter: nf_tables: unconditionally flush pending work before notifier
On Thu, 4 Jul 2024 12:54:18 +0200 Florian Westphal <fw@...len.de>
> Hillf Danton <hdanton@...a.com> wrote:
> > On Wed, 3 Jul 2024 15:01:07 +0200 Florian Westphal <fw@...len.de>
> > > Hillf Danton <hdanton@...a.com> wrote:
> > > > On Wed, 3 Jul 2024 12:52:15 +0200 Florian Westphal <fw@...len.de>
> > > > > Hillf Danton <hdanton@...a.com> wrote:
> > > > > > Given trans->table goes thru the lifespan of trans, your proposal is a bandaid
> > > > > > if trans outlives table.
> > > > >
> > > > > trans must never outlive table.
> > > > >
> > > > What is preventing trans from being freed after closing sock, given
> > > > trans is freed in workqueue?
> > > >
> > > > close sock
> > > > queue work
> > >
> > > The notifier acquires the transaction mutex, locking out all other
> > > transactions, so no further transactions requests referencing
> > > the table can be queued.
> > >
> > As per the syzbot report, trans->table could be instantiated before
> > notifier acquires the transaction mutex. And in fact the lock helps
> > trans outlive table even with your patch.
> >
> > cpu1 cpu2
> > --- ---
> > transB->table = A
> > lock trans mutex
> > flush work
> > free A
> > unlock trans mutex
> >
> > queue work to free transB
>
> Can you show a crash reproducer or explain how this assign
> and queueing happens unordered wrt. cpu2?
>
Not so difficult.
> This should look like this:
>
> cpu1 cpu2
> --- ---
> lock trans mutex
> lock trans mutex -> blocks
> transB->table = A
> queue work to free transB
> unlock trans mutex
> lock trans mutex returns
> flush work
> free A
> unlock trans mutex
>
If your patch is correct, it should survive a warning.
#syz test https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git 1c5fc27bc48a
--- x/net/netfilter/nf_tables_api.c
+++ y/net/netfilter/nf_tables_api.c
@@ -11552,9 +11552,10 @@ static int nft_rcv_nl_event(struct notif
gc_seq = nft_gc_seq_begin(nft_net);
- if (!list_empty(&nf_tables_destroy_list))
- nf_tables_trans_destroy_flush_work();
+ nf_tables_trans_destroy_flush_work();
again:
+ WARN_ON(!list_empty(&nft_net->commit_list));
+
list_for_each_entry(table, &nft_net->tables, list) {
if (nft_table_has_owner(table) &&
n->portid == table->nlpid) {
--
Powered by blists - more mailing lists