]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
payload: take endianess into account when updating the payload context
authorPatrick McHardy <kaber@trash.net>
Mon, 18 Aug 2014 23:21:59 +0000 (00:21 +0100)
committerPatrick McHardy <kaber@trash.net>
Mon, 18 Aug 2014 23:21:59 +0000 (00:21 +0100)
payload_expr_pctx_update() uses the numeric protocol value in host byte
order to find the upper layer protocol. This obviously doesn't work for
protocol expressions in other byte orders, such as the ethernet protocol
on little endian.

Export the protocol value in the correct byte order and use that value
to look up the upper layer protocol.

Signed-off-by: Patrick McHardy <kaber@trash.net>
src/payload.c

index a1785a59bf59c4cfa07a25219b3a92d1912bc5a2..47861ed2767a8a7997ee8c41580081192862e277 100644 (file)
@@ -69,13 +69,20 @@ static void payload_expr_pctx_update(struct proto_ctx *ctx,
 {
        const struct expr *left = expr->left, *right = expr->right;
        const struct proto_desc *base, *desc;
+       unsigned int proto = 0;
 
        if (!(left->flags & EXPR_F_PROTOCOL))
                return;
 
        assert(expr->op == OP_EQ);
+
+       /* Export the data in the correct byte order */
+       assert(right->len / BITS_PER_BYTE <= sizeof(proto));
+       mpz_export_data(&proto, right->value, right->byteorder,
+                       right->len / BITS_PER_BYTE);
+
        base = ctx->protocol[left->payload.base].desc;
-       desc = proto_find_upper(base, mpz_get_uint32(right->value));
+       desc = proto_find_upper(base, proto);
 
        proto_ctx_update(ctx, left->payload.base + 1, &expr->location, desc);
 }