diff options
author | Patrick McHardy <kaber@trash.net> | 2012-12-05 19:45:22 +0100 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2012-12-05 19:45:22 +0100 |
commit | 84792b4813a4ebf59e546acfac80144775e0d47e (patch) | |
tree | 7cc73c23024ef74926eb66c7f49349f4ecebf1e8 | |
parent | 6c3eec6ad009d7ed8a219291b98886a80b26b8e4 (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.c | 27 |
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: |