]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
intervals: unset EXPR_F_KERNEL for adjusted elements
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 13 Apr 2022 13:37:19 +0000 (15:37 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 13 Apr 2022 14:31:41 +0000 (16:31 +0200)
This element is adjusted, reset the EXPR_F_KERNEL flag, this is a new
element and the old is purged from the kernel.

The existing list of elements in the kernel is spliced to the elements
to be removed, then merge-sorted. The EXPR_F_REMOVE flag specifies that
this element represents a deletion.

The EXPR_F_REMOVE and EXPR_F_KERNEL allows to track objects: whether
element is in the kernel (EXPR_F_KERNEL), element is new (no flag) or
element represents a removal (EXPR_F_REMOVE).

Reported-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/intervals.c

index 451bc4dd4dd45152396356cb25f423ed715ea34c..cdda9e38ca5e37def070e6f02b906ddb2548d909 100644 (file)
@@ -279,7 +279,7 @@ static void remove_elem(struct expr *prev, struct set *set, struct expr *purge)
 static void __adjust_elem_left(struct set *set, struct expr *prev, struct expr *i,
                               struct expr *add)
 {
-       prev->flags &= EXPR_F_KERNEL;
+       prev->flags &= ~EXPR_F_KERNEL;
        expr_free(prev->key->left);
        prev->key->left = expr_get(i->key->right);
        mpz_add_ui(prev->key->left->value, prev->key->left->value, 1);
@@ -304,7 +304,7 @@ static void adjust_elem_left(struct set *set, struct expr *prev, struct expr *i,
 static void __adjust_elem_right(struct set *set, struct expr *prev, struct expr *i,
                                struct expr *add)
 {
-       prev->flags &= EXPR_F_KERNEL;
+       prev->flags &= ~EXPR_F_KERNEL;
        expr_free(prev->key->right);
        prev->key->right = expr_get(i->key->left);
        mpz_sub_ui(prev->key->right->value, prev->key->right->value, 1);
@@ -334,7 +334,7 @@ static void split_range(struct set *set, struct expr *prev, struct expr *i,
        clone = expr_clone(prev);
        list_move_tail(&clone->list, &purge->expressions);
 
-       prev->flags &= EXPR_F_KERNEL;
+       prev->flags &= ~EXPR_F_KERNEL;
        clone = expr_clone(prev);
        expr_free(clone->key->left);
        clone->key->left = expr_get(i->key->right);