From: Pablo Neira Ayuso Date: Wed, 13 Apr 2022 13:37:19 +0000 (+0200) Subject: intervals: unset EXPR_F_KERNEL for adjusted elements X-Git-Tag: v1.0.3~22 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ab1b21be54b2be4130f10dda7127aeca3195e252;p=thirdparty%2Fnftables.git intervals: unset EXPR_F_KERNEL for adjusted elements 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 Signed-off-by: Pablo Neira Ayuso --- diff --git a/src/intervals.c b/src/intervals.c index 451bc4dd..cdda9e38 100644 --- a/src/intervals.c +++ b/src/intervals.c @@ -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);