|
@@ -135,9 +135,12 @@ static bool __nft_rbtree_get(const struct net *net, const struct nft_set *set,
|
|
|
d = memcmp(this, key, set->klen);
|
|
|
if (d < 0) {
|
|
|
parent = rcu_dereference_raw(parent->rb_left);
|
|
|
- interval = rbe;
|
|
|
+ if (!(flags & NFT_SET_ELEM_INTERVAL_END))
|
|
|
+ interval = rbe;
|
|
|
} else if (d > 0) {
|
|
|
parent = rcu_dereference_raw(parent->rb_right);
|
|
|
+ if (flags & NFT_SET_ELEM_INTERVAL_END)
|
|
|
+ interval = rbe;
|
|
|
} else {
|
|
|
if (!nft_set_elem_active(&rbe->ext, genmask))
|
|
|
parent = rcu_dereference_raw(parent->rb_left);
|
|
@@ -154,7 +157,10 @@ static bool __nft_rbtree_get(const struct net *net, const struct nft_set *set,
|
|
|
|
|
|
if (set->flags & NFT_SET_INTERVAL && interval != NULL &&
|
|
|
nft_set_elem_active(&interval->ext, genmask) &&
|
|
|
- !nft_rbtree_interval_end(interval)) {
|
|
|
+ ((!nft_rbtree_interval_end(interval) &&
|
|
|
+ !(flags & NFT_SET_ELEM_INTERVAL_END)) ||
|
|
|
+ (nft_rbtree_interval_end(interval) &&
|
|
|
+ (flags & NFT_SET_ELEM_INTERVAL_END)))) {
|
|
|
*elem = interval;
|
|
|
return true;
|
|
|
}
|