summaryrefslogtreecommitdiffstats
path: root/src/evaluate.c
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 /src/evaluate.c
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".
Diffstat (limited to 'src/evaluate.c')
-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: