summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAnders Grahn <anders.grahn@gmail.com>2026-02-03 16:48:30 +0300
committerSasha Levin <sashal@kernel.org>2026-03-04 15:19:44 +0300
commitcb5c028afed9959d667c36e9a7076d5dbc37fa9d (patch)
tree211436c00d652f3cf4a07a5497e1cf37cdcd760f /include
parentf75e2fbdfc180fa43cc543df032e850f4d69f319 (diff)
downloadlinux-cb5c028afed9959d667c36e9a7076d5dbc37fa9d.tar.xz
netfilter: nft_counter: fix reset of counters on 32bit archs
[ Upstream commit 1e13f27e0675552161ab1778be9a23a636dde8a7 ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/u64_stats_sync.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/include/linux/u64_stats_sync.h b/include/linux/u64_stats_sync.h
index 79c3bbaa7e13..0a3f9416f846 100644
--- a/include/linux/u64_stats_sync.h
+++ b/include/linux/u64_stats_sync.h
@@ -89,6 +89,11 @@ static inline void u64_stats_add(u64_stats_t *p, unsigned long val)
local64_add(val, &p->v);
}
+static inline void u64_stats_sub(u64_stats_t *p, s64 val)
+{
+ local64_sub(val, &p->v);
+}
+
static inline void u64_stats_inc(u64_stats_t *p)
{
local64_inc(&p->v);
@@ -130,6 +135,11 @@ static inline void u64_stats_add(u64_stats_t *p, unsigned long val)
p->v += val;
}
+static inline void u64_stats_sub(u64_stats_t *p, s64 val)
+{
+ p->v -= val;
+}
+
static inline void u64_stats_inc(u64_stats_t *p)
{
p->v++;