]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
intervals: add elements with EXPR_F_KERNEL to purge list only
authorPablo Neira Ayuso <pablo@netfilter.org>
Thu, 14 Apr 2022 16:16:31 +0000 (18:16 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 18 Apr 2022 13:03:28 +0000 (15:03 +0200)
Do not add elements to purge list which are not in the kernel,
otherwise, bogus ENOENT is reported.

Fixes: 3e8d934e4f722 ("intervals: support to partial deletion with automerge")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/intervals.c

index a8fada9ba079b1528616904a0bd737759be4d3b7..590a2967c0f39c5b099fd2280238b6f887de5fd2 100644 (file)
@@ -329,8 +329,10 @@ static void split_range(struct set *set, struct expr *prev, struct expr *i,
 {
        struct expr *clone;
 
-       clone = expr_clone(prev);
-       list_move_tail(&clone->list, &purge->expressions);
+       if (prev->flags & EXPR_F_KERNEL) {
+               clone = expr_clone(prev);
+               list_move_tail(&clone->list, &purge->expressions);
+       }
 
        prev->flags &= ~EXPR_F_KERNEL;
        clone = expr_clone(prev);
@@ -413,7 +415,9 @@ static int setelem_delete(struct list_head *msgs, struct set *set,
                if (mpz_cmp(prev_range.low, range.low) == 0 &&
                    mpz_cmp(prev_range.high, range.high) == 0) {
                        if (i->flags & EXPR_F_REMOVE) {
-                               list_move_tail(&prev->list, &purge->expressions);
+                               if (prev->flags & EXPR_F_KERNEL)
+                                       list_move_tail(&prev->list, &purge->expressions);
+
                                list_del(&i->list);
                                expr_free(i);
                        }