Commit 1a422e54 authored by Pablo Neira Ayuso's avatar Pablo Neira Ayuso Committed by Greg Kroah-Hartman

netfilter: nft_set_rbtree: handle element re-addition after deletion

commit d2df92e9 upstream.

The existing code selects no next branch to be inspected when
re-inserting an inactive element into the rb-tree, looping endlessly.
This patch restricts the check for active elements to the EEXIST case
only.

Fixes: e701001e ("netfilter: nft_rbtree: allow adjacent intervals with dynamic updates")
Reported-by: default avatarWolfgang Bumiller <w.bumiller@proxmox.com>
Tested-by: default avatarWolfgang Bumiller <w.bumiller@proxmox.com>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6b183d1b
...@@ -117,17 +117,17 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, ...@@ -117,17 +117,17 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set,
else if (d > 0) else if (d > 0)
p = &parent->rb_right; p = &parent->rb_right;
else { else {
if (nft_set_elem_active(&rbe->ext, genmask)) {
if (nft_rbtree_interval_end(rbe) && if (nft_rbtree_interval_end(rbe) &&
!nft_rbtree_interval_end(new)) !nft_rbtree_interval_end(new)) {
p = &parent->rb_left; p = &parent->rb_left;
else if (!nft_rbtree_interval_end(rbe) && } else if (!nft_rbtree_interval_end(rbe) &&
nft_rbtree_interval_end(new)) nft_rbtree_interval_end(new)) {
p = &parent->rb_right; p = &parent->rb_right;
else { } else if (nft_set_elem_active(&rbe->ext, genmask)) {
*ext = &rbe->ext; *ext = &rbe->ext;
return -EEXIST; return -EEXIST;
} } else {
p = &parent->rb_left;
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment