summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/netlink.c7
-rw-r--r--src/segtree.c8
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.