Commit d2df92e9 authored by Pablo Neira Ayuso's avatar Pablo Neira Ayuso

netfilter: nft_set_rbtree: handle element re-addition after deletion

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>
parent f3c0eb05
...@@ -116,17 +116,17 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, ...@@ -116,17 +116,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 if (nft_set_elem_active(&rbe->ext, genmask)) {
else { *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