path: root/src/expression.c
diff options
authorSabrina Dubroca <>2018-05-25 15:23:16 +0200
committerFlorian Westphal <>2018-05-25 17:48:55 +0200
commitabbe85b3fdc101b23acdbb874d26d10686cf8a95 (patch)
tree44f6e835975cb08516bde94ca6b26201a795fa7a /src/expression.c
parentbe90e03dd1fa374aeaebb4de3174b97c3bd224f8 (diff)
fix printing of "tcp flags syn" and "tcp flags == syn" expressions
Commit 6979625686ec ("relational: Eliminate meta OPs") introduced some bugs when printing bitmask types. First, during the post-processing phase of delinearization, the expression for "tcp flags syn" (PAYLOAD & flag != 0) gets converted to PAYLOAD == flag, which is not equivalent. This should be PAYLOAD (IMPL) flag. Then, during output, the "==" sign from "tcp flags == syn" is dropped, because the bitmask condition in must_print_eq_op() was removed. Let's restore it, so that "tcp flags == syn" doesn't get printed as "tcp flags syn". An extra check for value types is added, so that we don't start printing "==" for sets such as "tcp flags {syn,ack}" Finally, add a regression test for this particular case. Fixes: 6979625686ec ("relational: Eliminate meta OPs") Signed-off-by: Sabrina Dubroca <> Signed-off-by: Florian Westphal <>
Diffstat (limited to 'src/expression.c')
1 files changed, 5 insertions, 0 deletions
diff --git a/src/expression.c b/src/expression.c
index 53fb1811..bea0f4c8 100644
--- a/src/expression.c
+++ b/src/expression.c
@@ -565,6 +565,11 @@ static void binop_arg_print(const struct expr *op, const struct expr *arg,
bool must_print_eq_op(const struct expr *expr)
+ if (expr->right->dtype->basetype != NULL &&
+ expr->right->dtype->basetype->type == TYPE_BITMASK &&
+ expr->right->ops->type == EXPR_VALUE)
+ return true;
return expr->left->ops->type == EXPR_BINOP;