From: Phil Sutter <phil@nwl.cc>
To: Pablo Neira Ayuso <pablo@netfilter.org>
Cc: netfilter-devel@vger.kernel.org, Florian Westphal <fw@strlen.de>
Subject: Re: [iptables PATCH 3/3] nft: Fix for concurrent noflush restore calls
Date: Wed, 14 Oct 2020 11:46:40 +0200 [thread overview]
Message-ID: <20201014094640.GA13016@orbyte.nwl.cc> (raw)
In-Reply-To: <20201013101502.GA29142@salvia>
On Tue, Oct 13, 2020 at 12:15:02PM +0200, Pablo Neira Ayuso wrote:
> On Tue, Oct 13, 2020 at 12:08:03PM +0200, Phil Sutter wrote:
> [...]
> > On Mon, Oct 12, 2020 at 02:54:50PM +0200, Pablo Neira Ayuso wrote:
> > [...]
> > > Patch LGTM, thanks Phil.
> > >
> > > What I don't clearly see yet is what scenario is triggering the bug in
> > > the existing code, if you don't mind to explain.
> >
> > See the test case attached to the patch: An other iptables-restore
> > process may add references (i.e., jumps) to a chain the own
> > iptables-restore process wants to delete. This should not be a problem
> > because these references are added to a chain that is being flushed by
> > the own process as well. But if that chain doesn't exist while the own
> > process fetches kernel's ruleset, this flush job is not created.
>
> Let me rephrase this:
>
> 1) process A fetches the ruleset, finds no chain C (no flush job then)
> 2) process B adds new chain C, flush job is present
> 3) process B adds the ruleset
> 4) process A appends rules to the existing chain C (because there is
> no flush job)
>
> Is this the scenario? If so, I wonder why the generation ID is not
> helping to refresh and retry.
Not quite, let me try to put this more clearly:
* Dump A:
| *filter
| :FOO - [0:0] # flush chain FOO
| -X BAR # remove chain BAR
| COMMIT
* Dump B:
| *filter
| -A FOO -j BAR # reference BAR from a rule in FOO
| COMMIT
* Kernel ruleset:
| *filter
| :BAR - [0:0]
| COMMIT
* Process A:
* read dump A
* fetch cache
* Process B:
* read dump B
* fetch ruleset
* commit to kernel
* Process A:
* skip flush chain FOO job: not present
* add delete chain BAR job: chain exists
* commit fails (genid outdated)
* refresh transaction:
* delete chain BAR job remains active
* genid updated
* commit fails: can't remove chain BAR: EBUSY
I realize the test case is not quite effective, ruleset should be
emptied upon each iteration of concurrent restore job startup.
Cheers, Phil
next prev parent reply other threads:[~2020-10-14 9:46 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-05 14:48 [iptables PATCH 0/3] nft: Fix transaction refreshing Phil Sutter
2020-10-05 14:48 ` [iptables PATCH 1/3] nft: Make batch_add_chain() return the added batch object Phil Sutter
2020-10-05 21:07 ` Florian Westphal
2020-10-05 14:48 ` [iptables PATCH 2/3] nft: Fix error reporting for refreshed transactions Phil Sutter
2020-10-05 21:13 ` Florian Westphal
2020-10-05 14:48 ` [iptables PATCH 3/3] nft: Fix for concurrent noflush restore calls Phil Sutter
2020-10-12 12:54 ` Pablo Neira Ayuso
2020-10-13 10:08 ` Phil Sutter
2020-10-13 10:15 ` Pablo Neira Ayuso
2020-10-14 9:46 ` Phil Sutter [this message]
2020-10-16 15:28 ` Pablo Neira Ayuso
2020-10-26 16:31 ` Phil Sutter
2020-10-26 16:36 ` Pablo Neira Ayuso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201014094640.GA13016@orbyte.nwl.cc \
--to=phil@nwl.cc \
--cc=fw@strlen.de \
--cc=netfilter-devel@vger.kernel.org \
--cc=pablo@netfilter.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).