summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2016-03-07 17:38:23 +0100
committerFlorian Westphal <fw@strlen.de>2016-03-10 14:08:34 +0100
commitebb0dd15731d2782b6ade1a0904c2c8890e5b5aa (patch)
tree79cc75666b40b7cf2e90c238920cd1bf09136c9c
parent2294f6828cd73c12ed76b93f65ffe7315c947c96 (diff)
netlink_delinearize: fix bogus offset w exthdr expressions
Need to fetch the offset from the exthdr template. Signed-off-by: Florian Westphal <fw@strlen.de> Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--src/netlink_linearize.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/netlink_linearize.c b/src/netlink_linearize.c
index 07f70e06..49b46760 100644
--- a/src/netlink_linearize.c
+++ b/src/netlink_linearize.c
@@ -320,19 +320,24 @@ static void netlink_gen_range(struct netlink_linearize_ctx *ctx,
static void payload_shift_value(const struct expr *left, struct expr *right)
{
+ unsigned int offset;
+
if (right->ops->type != EXPR_VALUE)
return;
switch (left->ops->type) {
case EXPR_PAYLOAD:
+ offset = left->payload.offset;
+ break;
case EXPR_EXTHDR:
+ offset = left->exthdr.tmpl->offset;
break;
default:
return;
}
mpz_lshift_ui(right->value,
- payload_shift_calc(left, left->payload.offset));
+ payload_shift_calc(left, offset));
}
static struct expr *netlink_gen_prefix(struct netlink_linearize_ctx *ctx,