diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2022-03-03 14:56:58 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2022-03-03 15:54:30 +0100 |
commit | 3f36cc6c3dcd5579841d169e495e49507846f3ce (patch) | |
tree | 9d1d0d75ae822c796cb1d6670564f1b73087c541 | |
parent | 19960c8d391509ac34b2ff527786ce8b9d832a7b (diff) |
optimize: do not merge unsupported statement expressions
Only value, range, prefix, set and list are supported at this stage.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r-- | src/optimize.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/optimize.c b/src/optimize.c index 6ba7e5a1..f8dd7f8d 100644 --- a/src/optimize.c +++ b/src/optimize.c @@ -91,6 +91,23 @@ static bool __expr_cmp(const struct expr *expr_a, const struct expr *expr_b) return true; } +static bool stmt_expr_supported(const struct expr *expr) +{ + switch (expr->right->etype) { + case EXPR_SYMBOL: + case EXPR_RANGE: + case EXPR_PREFIX: + case EXPR_SET: + case EXPR_LIST: + case EXPR_VALUE: + return true; + default: + break; + } + + return false; +} + static bool __stmt_type_eq(const struct stmt *stmt_a, const struct stmt *stmt_b) { struct expr *expr_a, *expr_b; @@ -103,6 +120,10 @@ static bool __stmt_type_eq(const struct stmt *stmt_a, const struct stmt *stmt_b) expr_a = stmt_a->expr; expr_b = stmt_b->expr; + if (!stmt_expr_supported(expr_a) || + !stmt_expr_supported(expr_b)) + return false; + return __expr_cmp(expr_a->left, expr_b->left); case STMT_COUNTER: case STMT_NOTRACK: |