]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
segtree: honor set element expiration
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 6 Jan 2021 13:58:36 +0000 (14:58 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 6 Jan 2021 14:00:47 +0000 (15:00 +0100)
Extend c1f0476fd590 ("segtree: copy expr data to closing element") to
use interval_expr_copy() from the linearization path.

Reported-by: Mike Dillinger <miked@softtalker.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/segtree.c

index 6988d07b24fb33f7c26ae642f983e730da46a018..9aa39e52d8a091149792a975d40cef1c54a6df01 100644 (file)
@@ -568,6 +568,18 @@ static void segtree_linearize(struct list_head *list, const struct set *set,
        mpz_clear(q);
 }
 
+static void interval_expr_copy(struct expr *dst, struct expr *src)
+{
+       if (src->comment)
+               dst->comment = xstrdup(src->comment);
+       if (src->timeout)
+               dst->timeout = src->timeout;
+       if (src->expiration)
+               dst->expiration = src->expiration;
+
+       list_splice_init(&src->stmt_list, &dst->stmt_list);
+}
+
 static void set_insert_interval(struct expr *set, struct seg_tree *tree,
                                const struct elementary_interval *ei)
 {
@@ -580,17 +592,11 @@ static void set_insert_interval(struct expr *set, struct seg_tree *tree,
 
        if (ei->expr != NULL) {
                if (ei->expr->etype == EXPR_MAPPING) {
-                       if (ei->expr->left->comment)
-                               expr->comment = xstrdup(ei->expr->left->comment);
-                       if (ei->expr->left->timeout)
-                               expr->timeout = ei->expr->left->timeout;
+                       interval_expr_copy(expr, ei->expr->left);
                        expr = mapping_expr_alloc(&ei->expr->location, expr,
                                                  expr_get(ei->expr->right));
                } else {
-                       if (ei->expr->comment)
-                               expr->comment = xstrdup(ei->expr->comment);
-                       if (ei->expr->timeout)
-                               expr->timeout = ei->expr->timeout;
+                       interval_expr_copy(expr, ei->expr);
                }
        }
 
@@ -927,18 +933,6 @@ next:
        }
 }
 
-static void interval_expr_copy(struct expr *dst, struct expr *src)
-{
-       if (src->comment)
-               dst->comment = xstrdup(src->comment);
-       if (src->timeout)
-               dst->timeout = src->timeout;
-       if (src->expiration)
-               dst->expiration = src->expiration;
-
-       list_splice_init(&src->stmt_list, &dst->stmt_list);
-}
-
 void interval_map_decompose(struct expr *set)
 {
        struct expr **elements, **ranges;