From 3d6cf7f355f80d8ca6c6378c4f399675360c0f8e Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Wed, 31 Mar 2021 01:26:19 +0200 Subject: netlink: don't crash when set elements are not evaluated as expected define foo = 2001:db8:123::/48 table inet filter { set foo { typeof ip6 saddr elements = $foo } } gives crash. This now exits with: stdin:1:14-30: Error: Unexpected initial set type prefix define foo = 2001:db8:123::/48 ^^^^^^^^^^^^^^^^^ For literals, bison parser protects us, as it enforces 'elements = { 2001:... '. For 'elements = $foo' we can't detect it at parsing stage as the '$foo' symbol might as well evaluate to "{ 2001, ...}" (i.e. we can't do a set element allocation). So at least detect this from set instantiaton. Signed-off-by: Florian Westphal --- src/evaluate.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/evaluate.c') diff --git a/src/evaluate.c b/src/evaluate.c index cebf7cb8..8105d8d5 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -3787,6 +3787,9 @@ static int set_evaluate(struct eval_ctx *ctx, struct set *set) set->key->byteorder, set->key->len, 0); if (expr_evaluate(ctx, &set->init) < 0) return -1; + if (set->init->etype != EXPR_SET) + return expr_error(ctx->msgs, set->init, "Set %s: Unexpected initial type %s, missing { }?", + set->handle.set.name, expr_name(set->init)); } ctx->set = NULL; -- cgit v1.2.3