summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2012-12-05 19:45:22 +0100
committerPatrick McHardy <kaber@trash.net>2012-12-05 19:45:22 +0100
commit84792b4813a4ebf59e546acfac80144775e0d47e (patch)
tree7cc73c23024ef74926eb66c7f49349f4ecebf1e8
parent6c3eec6ad009d7ed8a219291b98886a80b26b8e4 (diff)
evaluate: reintroduce type chekcs for relational expressions
Since the parser can now generate constant expressions of a specific type not determinaed by the LHS, we need to check that relational expressions are actually using the correct types to avoid accepting stupid things like "tcp dport tcp".
-rw-r--r--src/evaluate.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/evaluate.c b/src/evaluate.c
index da3a0d4e..ad3cefb9 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -875,6 +875,12 @@ static int expr_evaluate_relational(struct eval_ctx *ctx, struct expr **expr)
left = rel->left;
break;
case OP_EQ:
+ if (left->dtype != right->dtype)
+ return expr_binary_error(ctx, right, left,
+ "datatype mismatch, expected %s, "
+ "expression has type %s",
+ left->dtype->desc,
+ right->dtype->desc);
/*
* Update payload context for payload and meta iiftype equality
* expressions.
@@ -891,6 +897,13 @@ static int expr_evaluate_relational(struct eval_ctx *ctx, struct expr **expr)
}
case OP_NEQ:
case OP_FLAGCMP:
+ if (left->dtype != right->dtype)
+ return expr_binary_error(ctx, right, left,
+ "datatype mismatch, expected %s, "
+ "expression has type %s",
+ left->dtype->desc,
+ right->dtype->desc);
+
switch (right->ops->type) {
case EXPR_RANGE:
goto range;
@@ -910,6 +923,13 @@ static int expr_evaluate_relational(struct eval_ctx *ctx, struct expr **expr)
case OP_GT:
case OP_LTE:
case OP_GTE:
+ if (left->dtype != right->dtype)
+ return expr_binary_error(ctx, right, left,
+ "datatype mismatch, expected %s, "
+ "expression has type %s",
+ left->dtype->desc,
+ right->dtype->desc);
+
switch (left->ops->type) {
case EXPR_CONCAT:
return expr_binary_error(ctx, left, rel,
@@ -934,6 +954,13 @@ static int expr_evaluate_relational(struct eval_ctx *ctx, struct expr **expr)
return -1;
break;
case OP_RANGE:
+ if (left->dtype != right->dtype)
+ return expr_binary_error(ctx, right, left,
+ "datatype mismatch, expected %s, "
+ "expression has type %s",
+ left->dtype->desc,
+ right->dtype->desc);
+
range:
switch (left->ops->type) {
case EXPR_CONCAT: