net/netfilter/nf_conntrack_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
struct nf_conn)->timeout can be read/written locklessly,
add READ_ONCE()/WRITE_ONCE() to prevent load/store tearing.
The patch 'commit 802a7dc5cf1b ("netfilter: conntrack: annotate
data-races around ct->timeout")'fixed it, but there was a
missing part that this patch completes it.
Fixes: 802a7dc5cf1b ("netfilter: conntrack: annotate data-races around ct->timeout")
Signed-off-by: Chenguang Zhao <zhaochenguang@kylinos.cn>
---
net/netfilter/nf_conntrack_core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index 344f88295976..df4426adc9c8 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -1297,7 +1297,7 @@ __nf_conntrack_confirm(struct sk_buff *skb)
/* Timeout is relative to confirmation time, not original
setting time, otherwise we'd get timer wrap in
weird delay cases. */
- ct->timeout += nfct_time_stamp;
+ WRITE_ONCE(ct->timeout, READ_ONCE(ct->timeout) + nfct_time_stamp);
__nf_conntrack_insert_prepare(ct);
--
2.25.1
Chenguang Zhao <zhaochenguang@kylinos.cn> wrote:
> struct nf_conn)->timeout can be read/written locklessly,
> add READ_ONCE()/WRITE_ONCE() to prevent load/store tearing.
Do you have a KCSAN splat or similar?
> The patch 'commit 802a7dc5cf1b ("netfilter: conntrack: annotate
> data-races around ct->timeout")'fixed it, but there was a
> missing part that this patch completes it.
I'm no longer sure this was missing.
> diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
> index 344f88295976..df4426adc9c8 100644
> --- a/net/netfilter/nf_conntrack_core.c
> +++ b/net/netfilter/nf_conntrack_core.c
> @@ -1297,7 +1297,7 @@ __nf_conntrack_confirm(struct sk_buff *skb)
> /* Timeout is relative to confirmation time, not original
> setting time, otherwise we'd get timer wrap in
> weird delay cases. */
> - ct->timeout += nfct_time_stamp;
> + WRITE_ONCE(ct->timeout, READ_ONCE(ct->timeout) + nfct_time_stamp);
Here we hold the bucket insert locks for ct, so I don't see
how we can have concurrent modification here.
© 2016 - 2025 Red Hat, Inc.