diff options
-rw-r--r-- | include/expression.h | 8 | ||||
-rw-r--r-- | src/evaluate.c | 28 |
2 files changed, 28 insertions, 8 deletions
diff --git a/include/expression.h b/include/expression.h index 6a509b33..13ca315c 100644 --- a/include/expression.h +++ b/include/expression.h @@ -104,21 +104,24 @@ enum symbol_types { * @dtype: expected datatype * @byteorder: expected byteorder * @len: expected len + * @maxval: expected maximum value */ struct expr_ctx { const struct datatype *dtype; enum byteorder byteorder; unsigned int len; + unsigned int maxval; }; static inline void __expr_set_context(struct expr_ctx *ctx, const struct datatype *dtype, enum byteorder byteorder, - unsigned int len) + unsigned int len, unsigned int maxval) { ctx->dtype = dtype; ctx->byteorder = byteorder; ctx->len = len; + ctx->maxval = maxval; } static inline void expr_set_context(struct expr_ctx *ctx, @@ -126,7 +129,8 @@ static inline void expr_set_context(struct expr_ctx *ctx, unsigned int len) { __expr_set_context(ctx, dtype, - dtype ? dtype->byteorder : BYTEORDER_INVALID, len); + dtype ? dtype->byteorder : BYTEORDER_INVALID, + len, 0); } /** diff --git a/src/evaluate.c b/src/evaluate.c index 39573e96..7eb28f2c 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -266,12 +266,23 @@ static int expr_evaluate_string(struct eval_ctx *ctx, struct expr **exprp) static int expr_evaluate_integer(struct eval_ctx *ctx, struct expr **exprp) { struct expr *expr = *exprp; + char *valstr, *rangestr; mpz_t mask; + if (ctx->ectx.maxval > 0 && + mpz_cmp_ui(expr->value, ctx->ectx.maxval) > 0) { + valstr = mpz_get_str(NULL, 10, expr->value); + expr_error(ctx->msgs, expr, + "Value %s exceeds valid range 0-%u", + valstr, ctx->ectx.maxval); + free(valstr); + return -1; + } + 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); + valstr = mpz_get_str(NULL, 10, expr->value); + rangestr = mpz_get_str(NULL, 10, mask); expr_error(ctx->msgs, expr, "Value %s exceeds valid range 0-%s", valstr, rangestr); @@ -309,7 +320,7 @@ static int expr_evaluate_value(struct eval_ctx *ctx, struct expr **expr) static int expr_evaluate_primary(struct eval_ctx *ctx, struct expr **expr) { __expr_set_context(&ctx->ectx, (*expr)->dtype, (*expr)->byteorder, - (*expr)->len); + (*expr)->len, 0); return 0; } @@ -1186,9 +1197,13 @@ static void expr_dtype_integer_compatible(struct eval_ctx *ctx, static int expr_evaluate_numgen(struct eval_ctx *ctx, struct expr **exprp) { - expr_dtype_integer_compatible(ctx, *exprp); + struct expr *expr = *exprp; + + expr_dtype_integer_compatible(ctx, expr); - return expr_evaluate_primary(ctx, exprp); + __expr_set_context(&ctx->ectx, expr->dtype, expr->byteorder, expr->len, + expr->numgen.mod - 1); + return 0; } static int expr_evaluate_hash(struct eval_ctx *ctx, struct expr **exprp) @@ -1205,7 +1220,8 @@ static int expr_evaluate_hash(struct eval_ctx *ctx, struct expr **exprp) * expression to be hashed. Since this input is transformed to a 4 bytes * integer, restore context to the datatype that results from hashing. */ - expr_set_context(&ctx->ectx, expr->dtype, expr->len); + __expr_set_context(&ctx->ectx, expr->dtype, expr->byteorder, expr->len, + expr->hash.mod - 1); return 0; } |