From: Anders K. Pedersen Date: Sat, 29 Oct 2016 09:49:09 +0000 (+0000) Subject: evaluate: Allow concatenation of rt nexthop etc. X-Git-Tag: v0.7~51 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ea9f60be2a31ed06198c22e2cd60d68866d0fdb3;p=thirdparty%2Fnftables.git evaluate: Allow concatenation of rt nexthop etc. Concatenations of rt nexthop or ct {orignal | reply} {saddr | daddr} fail due to # nft add rule ip filter postrouting flow table acct \{ ip saddr . rt nexthop counter \} :1:61-70: Error: can not use variable sized data types (invalid) in concat expressions add rule ip filter postrouting flow table acct { ip saddr . rt nexthop counter } ~~~~~~~~~~~^^^^^^^^^^ Fix this by reordering the check for variable size data types in expr_evaluate_concat() to happen after expr_evaluate() has been called (via list_member_evaluate()) for the sub expression. This allows expr_evaluate_[cr]t() to call [cr]t_expr_update_type() and set the data type before the check. Signed-off-by: Anders K. Pedersen Signed-off-by: Pablo Neira Ayuso --- diff --git a/src/evaluate.c b/src/evaluate.c index 79add5ee..878efacd 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -987,13 +987,6 @@ static int expr_evaluate_concat(struct eval_ctx *ctx, struct expr **expr) "expecting %s", dtype->desc); - if (dtype == NULL && i->dtype->size == 0) - return expr_binary_error(ctx->msgs, i, *expr, - "can not use variable sized " - "data types (%s) in concat " - "expressions", - i->dtype->name); - if (dtype == NULL) tmp = datatype_lookup(TYPE_INVALID); else @@ -1004,6 +997,13 @@ static int expr_evaluate_concat(struct eval_ctx *ctx, struct expr **expr) return -1; flags &= i->flags; + if (dtype == NULL && i->dtype->size == 0) + return expr_binary_error(ctx->msgs, i, *expr, + "can not use variable sized " + "data types (%s) in concat " + "expressions", + i->dtype->name); + ntype = concat_subtype_add(ntype, i->dtype->type); }