From: Fernando Fernandez Mancera <fmancera@suse.de>
To: Florian Westphal <fw@strlen.de>
Cc: netfilter-devel@vger.kernel.org, coreteam@netfilter.org,
louis.t42@caramail.com
Subject: Re: [PATCH nf] netfilter: nft_connlimit: fix stale read of connection count
Date: Fri, 24 Oct 2025 17:47:34 +0200 [thread overview]
Message-ID: <b74b168f-d9bd-45c6-b4c5-d61163f34c08@suse.de> (raw)
In-Reply-To: <aPt13hRzJvTkkK4e@strlen.de>
On 10/24/25 2:49 PM, Florian Westphal wrote:
> Fernando Fernandez Mancera <fmancera@suse.de> wrote:
>> On 10/24/25 1:31 PM, Florian Westphal wrote:
>>> Fernando Fernandez Mancera <fmancera@suse.de> wrote:
>>>> nft_connlimit_eval() reads priv->list->count to check if the connection
>>>> limit has been exceeded. This value can be cached by the CPU while it
>>>> can be decremented by a different CPU when a connection is closed. This
>>>> causes a data race as the value cached might be outdated.
>>>>
>>>> When a new connection is established and evaluated by the connlimit
>>>> expression, priv->list->count is incremented by nf_conncount_add(),
>>>> triggering the CPU's cache coherency protocol and therefore refreshing
>>>> the cached value before updating it.
>>>>
>>>> Solve this situation by reading the value using READ_ONCE().
>>>
>>> Hmm, I am not sure about this.
>>>
>>> Patch looks correct (we read without holding a lock),
>>> but I don't see how compiler would emit different code here.
>>>
>>> This patch makes no difference on my end, same code is emitted.
>>>
>>> Can you show code before and after this patch on your side?
>>
>> I did `make net/netfilter/nft_connlimit.s` for before and after, then I
>> diffed both files with diff -u:
>>
>> I see a difference on how count is being handled.
>
> I'd apply this patch for correctness reasons. But I see no difference:
>
>> @@ -984,19 +984,19 @@
>> # net/netfilter/nft_connlimit.c:46: if
>> (nf_conncount_add(nft_net(pkt), priv->list, tuple_ptr, zone)) {
>> testl %eax, %eax # _30
>> jne .L65 #,
>> -# net/netfilter/nft_connlimit.c:51: count = priv->list->count;
>> - movq 8(%rbx), %rax # MEM[(struct nft_connlimit *)expr_2(D) + 8B].list,
>> MEM[(struct nft_connlimit *)expr_2(D) + 8B].list
>> +# net/netfilter/nft_connlimit.c:51: count = READ_ONCE(priv->list->count);
>> + movq 8(%rbx), %rax # MEM[(struct nft_connlimit *)expr_2(D) + 8B].list, _31
>> + movl 88(%rax), %eax # MEM[(const volatile unsigned int *)_31 + 88B], _32
>
> old:
> movq 8(%rbx), %rax
> movl 88(%rax), %eax
> cmpl %eax, 16(%rbx)
>
> new:
> movq 8(%rbx), %rax
> movl 88(%rax), %eax
> cmpl %eax, 16(%rbx)
>
> same instruction sequence, only comments differ.
> Doesn't invalidate the patch however, we do read while not holding
> any locks so this READ_ONCE annotation is needed.
>
Yes, you are right. Let me send a V2 clarifying the commit message. I am
sending some other patches as this requires other fixes..
prev parent reply other threads:[~2025-10-24 15:47 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-23 23:20 [PATCH nf] netfilter: nft_connlimit: fix stale read of connection count Fernando Fernandez Mancera
2025-10-23 23:32 ` Fernando Fernandez Mancera
2025-10-24 11:02 ` Florian Westphal
2025-10-24 11:14 ` Fernando Fernandez Mancera
2025-10-24 11:33 ` Florian Westphal
2025-10-24 11:31 ` Florian Westphal
2025-10-24 11:55 ` Fernando Fernandez Mancera
2025-10-24 12:49 ` Florian Westphal
2025-10-24 13:04 ` Fernando Fernandez Mancera
2025-10-24 15:47 ` Fernando Fernandez Mancera [this message]
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=b74b168f-d9bd-45c6-b4c5-d61163f34c08@suse.de \
--to=fmancera@suse.de \
--cc=coreteam@netfilter.org \
--cc=fw@strlen.de \
--cc=louis.t42@caramail.com \
--cc=netfilter-devel@vger.kernel.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).