Skip to content

Commit d2df92e

Browse files
committed
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: e701001 ("netfilter: nft_rbtree: allow adjacent intervals with dynamic updates") Reported-by: Wolfgang Bumiller <w.bumiller@proxmox.com> Tested-by: Wolfgang Bumiller <w.bumiller@proxmox.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
1 parent f3c0eb0 commit d2df92e

File tree

1 file changed

+11
-11
lines changed

1 file changed

+11
-11
lines changed

net/netfilter/nft_set_rbtree.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,17 +116,17 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set,
116116
else if (d > 0)
117117
p = &parent->rb_right;
118118
else {
119-
if (nft_set_elem_active(&rbe->ext, genmask)) {
120-
if (nft_rbtree_interval_end(rbe) &&
121-
!nft_rbtree_interval_end(new))
122-
p = &parent->rb_left;
123-
else if (!nft_rbtree_interval_end(rbe) &&
124-
nft_rbtree_interval_end(new))
125-
p = &parent->rb_right;
126-
else {
127-
*ext = &rbe->ext;
128-
return -EEXIST;
129-
}
119+
if (nft_rbtree_interval_end(rbe) &&
120+
!nft_rbtree_interval_end(new)) {
121+
p = &parent->rb_left;
122+
} else if (!nft_rbtree_interval_end(rbe) &&
123+
nft_rbtree_interval_end(new)) {
124+
p = &parent->rb_right;
125+
} else if (nft_set_elem_active(&rbe->ext, genmask)) {
126+
*ext = &rbe->ext;
127+
return -EEXIST;
128+
} else {
129+
p = &parent->rb_left;
130130
}
131131
}
132132
}

0 commit comments

Comments
 (0)