summaryrefslogtreecommitdiffstats
path: root/src/expression.c
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2022-04-09 15:58:28 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2022-04-13 13:43:35 +0200
commit2fb4d7ead460ec4fb00bd317d93a5e076f825b39 (patch)
treefb50ec5e275ba6148a30ff93152ec5a77674251f /src/expression.c
parent403936c1ffa34bc597d7ee0792154fc6c6b483f2 (diff)
src: make interval sets work with string datatypes
Allows to interface names in interval sets: table inet filter { set s { type ifname flags interval elements = { eth*, foo } } Concatenations are not yet supported, also, listing is broken, those strings will not be printed back because the values will remain in big-endian order. Followup patch will extend segtree to translate this back to host byte order. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/expression.c')
-rw-r--r--src/expression.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/expression.c b/src/expression.c
index deb649e1..5d879b53 100644
--- a/src/expression.c
+++ b/src/expression.c
@@ -1442,7 +1442,11 @@ void range_expr_value_low(mpz_t rop, const struct expr *expr)
{
switch (expr->etype) {
case EXPR_VALUE:
- return mpz_set(rop, expr->value);
+ mpz_set(rop, expr->value);
+ if (expr->byteorder == BYTEORDER_HOST_ENDIAN &&
+ expr_basetype(expr)->type == TYPE_STRING)
+ mpz_switch_byteorder(rop, expr->len / BITS_PER_BYTE);
+ return;
case EXPR_PREFIX:
return range_expr_value_low(rop, expr->prefix);
case EXPR_RANGE:
@@ -1462,7 +1466,7 @@ void range_expr_value_high(mpz_t rop, const struct expr *expr)
switch (expr->etype) {
case EXPR_VALUE:
- return mpz_set(rop, expr->value);
+ return range_expr_value_low(rop, expr);
case EXPR_PREFIX:
range_expr_value_low(rop, expr->prefix);
assert(expr->len >= expr->prefix_len);