summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/expression.h8
-rw-r--r--src/evaluate.c28
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;
}