From 84792b4813a4ebf59e546acfac80144775e0d47e Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Wed, 5 Dec 2012 19:45:22 +0100 Subject: 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". --- src/evaluate.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) 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: -- cgit v1.2.3