summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2023-10-17 12:28:27 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-10-25 12:16:15 +0200
commit0317bd5e189fc4fd0cc908deb6966fcef50ae7cf (patch)
tree80bd955a65b5702fca84ec6f4a2b1aba4caa80c5 /net
parent6d466bfe7bf3621261a077b785eb3e260b0eba08 (diff)
downloadlinux-0317bd5e189fc4fd0cc908deb6966fcef50ae7cf.tar.gz
linux-0317bd5e189fc4fd0cc908deb6966fcef50ae7cf.tar.bz2
linux-0317bd5e189fc4fd0cc908deb6966fcef50ae7cf.zip
netfilter: nft_set_rbtree: .deactivate fails if element has expired
commit d111692a59c1470ae530cbb39bcf0346c950ecc7 upstream. This allows to remove an expired element which is not possible in other existing set backends, this is more noticeable if gc-interval is high so expired elements remain in the tree. On-demand gc also does not help in this case, because this is delete element path. Return NULL if element has expired. Fixes: 8d8540c4f5e0 ("netfilter: nft_set_rbtree: add timeout support") Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net')
-rw-r--r--net/netfilter/nft_set_rbtree.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c
index 2660ceab3759..e34662f4a71e 100644
--- a/net/netfilter/nft_set_rbtree.c
+++ b/net/netfilter/nft_set_rbtree.c
@@ -568,6 +568,8 @@ static void *nft_rbtree_deactivate(const struct net *net,
nft_rbtree_interval_end(this)) {
parent = parent->rb_right;
continue;
+ } else if (nft_set_elem_expired(&rbe->ext)) {
+ break;
} else if (!nft_set_elem_active(&rbe->ext, genmask)) {
parent = parent->rb_left;
continue;