diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/evaluate.c | 19 | ||||
-rw-r--r-- | src/netlink_delinearize.c | 5 |
2 files changed, 17 insertions, 7 deletions
diff --git a/src/evaluate.c b/src/evaluate.c index 92e009ef..f8b8530c 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -199,13 +199,20 @@ static int byteorder_conversion(struct eval_ctx *ctx, struct expr **expr, assert(basetype == TYPE_INTEGER); - if (div_round_up(i->len, BITS_PER_BYTE) >= 2) { - op = byteorder_conversion_op(i, byteorder); - unary = unary_expr_alloc(&i->location, op, i); - if (expr_evaluate(ctx, &unary) < 0) - return -1; + switch (i->etype) { + case EXPR_VALUE: + if (i->byteorder == BYTEORDER_HOST_ENDIAN) + mpz_switch_byteorder(i->value, div_round_up(i->len, BITS_PER_BYTE)); + break; + default: + if (div_round_up(i->len, BITS_PER_BYTE) >= 2) { + op = byteorder_conversion_op(i, byteorder); + unary = unary_expr_alloc(&i->location, op, i); + if (expr_evaluate(ctx, &unary) < 0) + return -1; - list_replace(&i->list, &unary->list); + list_replace(&i->list, &unary->list); + } } } diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c index 27630a8a..1d30a78c 100644 --- a/src/netlink_delinearize.c +++ b/src/netlink_delinearize.c @@ -2722,10 +2722,11 @@ static struct expr *expr_postprocess_string(struct expr *expr) static void expr_postprocess_value(struct rule_pp_ctx *ctx, struct expr **exprp) { + bool interval = (ctx->set && ctx->set->flags & NFT_SET_INTERVAL); struct expr *expr = *exprp; // FIXME - if (expr->byteorder == BYTEORDER_HOST_ENDIAN) + if (expr->byteorder == BYTEORDER_HOST_ENDIAN && !interval) mpz_switch_byteorder(expr->value, expr->len / BITS_PER_BYTE); if (expr_basetype(expr)->type == TYPE_STRING) @@ -2869,7 +2870,9 @@ static void expr_postprocess(struct rule_pp_ctx *ctx, struct expr **exprp) datatype_set(expr->left, expr->right->dtype); } + ctx->set = expr->right->set; expr_postprocess(ctx, &expr->left); + ctx->set = NULL; break; default: expr_postprocess(ctx, &expr->left); |