]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
netfilter: ipset: fix region locking in hash types
authorJozsef Kadlecsik <kadlec@netfilter.org>
Wed, 7 May 2025 15:01:59 +0000 (17:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 18 May 2025 06:24:05 +0000 (08:24 +0200)
[ Upstream commit 8478a729c0462273188263136880480729e9efca ]

Region locking introduced in v5.6-rc4 contained three macros to handle
the region locks: ahash_bucket_start(), ahash_bucket_end() which gave
back the start and end hash bucket values belonging to a given region
lock and ahash_region() which should give back the region lock belonging
to a given hash bucket. The latter was incorrect which can lead to a
race condition between the garbage collector and adding new elements
when a hash type of set is defined with timeouts.

Fixes: f66ee0410b1c ("netfilter: ipset: Fix "INFO: rcu detected stall in hash_xxx" reports")
Reported-by: Kota Toda <kota.toda@gmo-cybersecurity.com>
Signed-off-by: Jozsef Kadlecsik <kadlec@netfilter.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/netfilter/ipset/ip_set_hash_gen.h

index 20aad81fcad7e63973d5e45c7f1c1099f1f07977..c2d88b1b06b8724d56f8bb697e4b2e4bb4fd49b0 100644 (file)
@@ -63,7 +63,7 @@ struct hbucket {
 #define ahash_sizeof_regions(htable_bits)              \
        (ahash_numof_locks(htable_bits) * sizeof(struct ip_set_region))
 #define ahash_region(n, htable_bits)           \
-       ((n) % ahash_numof_locks(htable_bits))
+       ((n) / jhash_size(HTABLE_REGION_BITS))
 #define ahash_bucket_start(h,  htable_bits)    \
        ((htable_bits) < HTABLE_REGION_BITS ? 0 \
                : (h) * jhash_size(HTABLE_REGION_BITS))