]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: reintroduce type chekcs for relational expressions
authorPatrick McHardy <kaber@trash.net>
Wed, 5 Dec 2012 18:45:22 +0000 (19:45 +0100)
committerPatrick McHardy <kaber@trash.net>
Wed, 5 Dec 2012 18:45:22 +0000 (19:45 +0100)
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

index da3a0d4e284e86c05a932162cac56b51e42e130e..ad3cefb9861fa8b6aeab7ddd3dc0ef3b0882ee2a 100644 (file)
@@ -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: