• Stefano Brivio's avatar
    netfilter: nft_set_rbtree: Detect partial overlaps on insertion · 7c84d414
    Stefano Brivio authored
    ...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: default avatarStefano Brivio <sbrivio@redhat.com>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    7c84d414
nft_set_rbtree.c 15.2 KB