netfilter: nft_set_rbtree: Detect partial overlaps on insertion
authorStefano Brivio <sbrivio@redhat.com>
Sun, 22 Mar 2020 02:22:01 +0000 (03:22 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 24 Mar 2020 18:59:37 +0000 (19:59 +0100)
commit7c84d41416d836ef7e533bd4d64ccbdf40c5ac70
tree15ae30f3a19627daef28fa3b11c32c701cada086
parent6f7c9caf017be8ab0fe3b99509580d0793bf0833
netfilter: nft_set_rbtree: Detect partial overlaps on insertion

...and return -ENOTEMPTY to the front-end in this case, instead of
proceeding. Currently, nft takes care of checking for these cases
and not sending them to the kernel, but if we drop the set_overlap()
call in nft we can end up in situations like:

 # nft add table t
 # nft add set t s '{ type inet_service ; flags interval ; }'
 # nft add element t s '{ 1 - 5 }'
 # nft add element t s '{ 6 - 10 }'
 # nft add element t s '{ 4 - 7 }'
 # nft list set t s
 table ip t {
  set s {
  type inet_service
  flags interval
  elements = { 1-3, 4-5, 6-7 }
  }
 }

This change has the primary purpose of making the behaviour
consistent with nft_set_pipapo, but is also functional to avoid
inconsistent behaviour if userspace sends overlapping elements for
any reason.

v2: When we meet the same key data in the tree, as start element while
    inserting an end element, or as end element while inserting a start
    element, actually check that the existing element is active, before
    resetting the overlap flag (Pablo Neira Ayuso)

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nft_set_rbtree.c