]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: set on expr->len for catchall set elements
authorPablo Neira Ayuso <pablo@netfilter.org>
Thu, 4 Jul 2024 14:38:22 +0000 (16:38 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 4 Jul 2024 22:10:47 +0000 (00:10 +0200)
Catchall elements coming from the parser provide expr->len == 0.
However, the existing mergesort implementation requires expr->len to be
set up to the length of the set key to properly sort elements.

In particular, set element deletion leverages such list sorting to find
if elements exists in the set.

Fixes: 419d19688688 ("src: add set element catch-all support")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/evaluate.c

index aa9293a8785689acdcaa762fd61f42ff41af3704..0a31c73e42761df7b9a9be2111dfe309cb4ed8c0 100644 (file)
@@ -1877,6 +1877,16 @@ err_missing_flag:
                          set_is_map(ctx->set->flags) ? "map" : "set", expr_name(key));
 }
 
+static int expr_evaluate_set_elem_catchall(struct eval_ctx *ctx, struct expr **expr)
+{
+       struct expr *elem = *expr;
+
+       if (ctx->set)
+               elem->len = ctx->set->key->len;
+
+       return 0;
+}
+
 static const struct expr *expr_set_elem(const struct expr *expr)
 {
        if (expr->etype == EXPR_MAPPING)
@@ -2996,7 +3006,7 @@ static int expr_evaluate(struct eval_ctx *ctx, struct expr **expr)
        case EXPR_XFRM:
                return expr_evaluate_xfrm(ctx, expr);
        case EXPR_SET_ELEM_CATCHALL:
-               return 0;
+               return expr_evaluate_set_elem_catchall(ctx, expr);
        case EXPR_FLAGCMP:
                return expr_evaluate_flagcmp(ctx, expr);
        default: