diff options
author | Florian Westphal <fw@strlen.de> | 2016-03-14 13:56:43 +0100 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2016-05-25 12:00:05 +0200 |
commit | f8fc4366c96882b256c1bc12f6d4b02ad8289b34 (patch) | |
tree | b536049ea850acdd481d71213103108ab6f7c816 /src | |
parent | 8979727084d90e6061c8d0f562f8f12e784a657d (diff) |
netlink_delinerize: don't use meta_match_postprocess for ct pp
meta_match_postprocess uses meta.base which is only accessible if
left expression has EXPR_META type, so we can't use it to handle ct postprocessing.
To reduce copy-pastry factor the common part into ct_meta_common_postprocess(),
then call that from both meta and ct postprocessing.
Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/netlink_delinearize.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c index de5d66c0..9e260784 100644 --- a/src/netlink_delinearize.c +++ b/src/netlink_delinearize.c @@ -1161,6 +1161,23 @@ static void payload_match_postprocess(struct rule_pp_ctx *ctx, } } +static void ct_meta_common_postprocess(const struct expr *expr) +{ + const struct expr *left = expr->left; + struct expr *right = expr->right; + + switch (expr->op) { + case OP_LOOKUP: + expr_set_type(right, left->dtype, left->byteorder); + if (right->dtype == &integer_type) + integer_type_postprocess(right); + break; + + default: + break; + } +} + static void meta_match_postprocess(struct rule_pp_ctx *ctx, const struct expr *expr) { @@ -1178,13 +1195,8 @@ static void meta_match_postprocess(struct rule_pp_ctx *ctx, payload_dependency_store(&ctx->pdctx, ctx->stmt, left->meta.base); break; - case OP_LOOKUP: - expr_set_type(expr->right, expr->left->dtype, - expr->left->byteorder); - if (expr->right->dtype == &integer_type) - integer_type_postprocess(expr->right); - break; default: + ct_meta_common_postprocess(expr); break; } } @@ -1192,7 +1204,17 @@ static void meta_match_postprocess(struct rule_pp_ctx *ctx, static void ct_match_postprocess(struct rule_pp_ctx *ctx, const struct expr *expr) { - return meta_match_postprocess(ctx, expr); + switch (expr->op) { + case OP_EQ: + if (expr->right->ops->type == EXPR_RANGE) + break; + + expr->left->ops->pctx_update(&ctx->pctx, expr); + break; + default: + ct_meta_common_postprocess(expr); + break; + } } /* Convert a bitmask to a prefix length */ |