diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2016-08-29 12:49:35 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2016-08-29 20:30:29 +0200 |
commit | cb7cb885d65ec02aa33872b4bd382ef8a692113a (patch) | |
tree | 50968c7fc1b2fb18f2b87d0658c2c69d58a6308c /src | |
parent | 345236211715ffb7cc28f6ff0b26acb90181e738 (diff) |
evaluate: add expr_evaluate_integer()
Add a helper function to wrap the integer evaluation code.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/evaluate.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/src/evaluate.c b/src/evaluate.c index 8f7824b5..39573e96 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -263,27 +263,35 @@ static int expr_evaluate_string(struct eval_ctx *ctx, struct expr **exprp) return 0; } -static int expr_evaluate_value(struct eval_ctx *ctx, struct expr **expr) +static int expr_evaluate_integer(struct eval_ctx *ctx, struct expr **exprp) { + struct expr *expr = *exprp; mpz_t mask; + mpz_init_bitmask(mask, ctx->ectx.len); + if (mpz_cmp(expr->value, mask) > 0) { + char *valstr = mpz_get_str(NULL, 10, expr->value); + char *rangestr = mpz_get_str(NULL, 10, mask); + expr_error(ctx->msgs, expr, + "Value %s exceeds valid range 0-%s", + valstr, rangestr); + free(valstr); + free(rangestr); + mpz_clear(mask); + return -1; + } + expr->byteorder = ctx->ectx.byteorder; + expr->len = ctx->ectx.len; + mpz_clear(mask); + return 0; +} + +static int expr_evaluate_value(struct eval_ctx *ctx, struct expr **expr) +{ switch (expr_basetype(*expr)->type) { case TYPE_INTEGER: - mpz_init_bitmask(mask, ctx->ectx.len); - if (mpz_cmp((*expr)->value, mask) > 0) { - char *valstr = mpz_get_str(NULL, 10, (*expr)->value); - char *rangestr = mpz_get_str(NULL, 10, mask); - expr_error(ctx->msgs, *expr, - "Value %s exceeds valid range 0-%s", - valstr, rangestr); - free(valstr); - free(rangestr); - mpz_clear(mask); + if (expr_evaluate_integer(ctx, expr) < 0) return -1; - } - (*expr)->byteorder = ctx->ectx.byteorder; - (*expr)->len = ctx->ectx.len; - mpz_clear(mask); break; case TYPE_STRING: if (expr_evaluate_string(ctx, expr) < 0) |