diff options
| author | Anders Grahn <anders.grahn@gmail.com> | 2026-02-03 14:48:30 +0100 |
|---|---|---|
| committer | Florian Westphal <fw@strlen.de> | 2026-02-06 13:34:55 +0100 |
| commit | 1e13f27e0675552161ab1778be9a23a636dde8a7 (patch) | |
| tree | 02c19d26559bf2a12fd4e668c50fb04aaff3d8d0 /net | |
| parent | 2f635adbe2642d398a0be3ab245accd2987be0c3 (diff) | |
| download | linux-next-1e13f27e0675552161ab1778be9a23a636dde8a7.tar.gz linux-next-1e13f27e0675552161ab1778be9a23a636dde8a7.zip | |
netfilter: nft_counter: fix reset of counters on 32bit archs
nft_counter_reset() calls u64_stats_add() with a negative value to reset
the counter. This will work on 64bit archs, hence the negative value
added will wrap as a 64bit value which then can wrap the stat counter as
well.
On 32bit archs, the added negative value will wrap as a 32bit value and
_not_ wrapping the stat counter properly. In most cases, this would just
lead to a very large 32bit value being added to the stat counter.
Fix by introducing u64_stats_sub().
Fixes: 4a1d3acd6ea8 ("netfilter: nft_counter: Use u64_stats_t for statistic.")
Signed-off-by: Anders Grahn <anders.grahn@gmail.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'net')
| -rw-r--r-- | net/netfilter/nft_counter.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/netfilter/nft_counter.c b/net/netfilter/nft_counter.c index cc7325329496..0d70325280cc 100644 --- a/net/netfilter/nft_counter.c +++ b/net/netfilter/nft_counter.c @@ -117,8 +117,8 @@ static void nft_counter_reset(struct nft_counter_percpu_priv *priv, nft_sync = this_cpu_ptr(&nft_counter_sync); u64_stats_update_begin(nft_sync); - u64_stats_add(&this_cpu->packets, -total->packets); - u64_stats_add(&this_cpu->bytes, -total->bytes); + u64_stats_sub(&this_cpu->packets, total->packets); + u64_stats_sub(&this_cpu->bytes, total->bytes); u64_stats_update_end(nft_sync); local_bh_enable(); |
