diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/netlink.c | 7 | ||||
-rw-r--r-- | src/segtree.c | 8 |
2 files changed, 6 insertions, 9 deletions
diff --git a/src/netlink.c b/src/netlink.c index 486e1247..9fc0b171 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -790,7 +790,7 @@ static void set_elem_parse_udata(struct nftnl_set_elem *nlse, } int netlink_delinearize_setelem(struct nftnl_set_elem *nlse, - const struct set *set, struct nft_cache *cache) + struct set *set, struct nft_cache *cache) { struct nft_data_delinearize nld; struct expr *expr, *key, *data; @@ -828,8 +828,11 @@ int netlink_delinearize_setelem(struct nftnl_set_elem *nlse, nle = nftnl_set_elem_get(nlse, NFTNL_SET_ELEM_EXPR, NULL); expr->stmt = netlink_parse_set_expr(set, cache, nle); } - if (flags & NFT_SET_ELEM_INTERVAL_END) + if (flags & NFT_SET_ELEM_INTERVAL_END) { expr->flags |= EXPR_F_INTERVAL_END; + if (mpz_cmp_ui(set->key->value, 0) == 0) + set->root = true; + } if (set_is_datamap(set->flags)) { if (nftnl_set_elem_is_set(nlse, NFTNL_SET_ELEM_DATA)) { diff --git a/src/segtree.c b/src/segtree.c index 7217dbca..d1dbe10c 100644 --- a/src/segtree.c +++ b/src/segtree.c @@ -451,7 +451,7 @@ static int set_to_segtree(struct list_head *msgs, struct set *set, static bool segtree_needs_first_segment(const struct set *set, const struct expr *init, bool add) { - if (add) { + if (add && !set->root) { /* Add the first segment in four situations: * * 1) This is an anonymous set. @@ -465,12 +465,6 @@ static bool segtree_needs_first_segment(const struct set *set, (set->init == init)) { return true; } - } else { - /* If the set is empty after the removal, we have to - * remove the first non-matching segment too. - */ - if (set->init && set->init->size - init->size == 0) - return true; } /* This is an update for a set that already contains elements, so don't * add the first non-matching elements otherwise we hit EEXIST. |