]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
payload: generate dependency in the appropriate byteorder
authorAlvaro Neira <alvaroneay@gmail.com>
Tue, 30 Sep 2014 15:21:37 +0000 (17:21 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 9 Oct 2014 11:22:55 +0000 (13:22 +0200)
If we add a dependency, the constant expression on the right
hand side must be represented in the appropriate order.

Example without this patch:

  nft add rule bridge filter input reject with icmp-host-unreach --debug netlink

  [ payload load 2b @ link header + 12 => reg 1 ]
  [ cmp eq reg 1 0x00000800 ]
  [ reject type 0 code 1 ]

When we create the payload expression we have the right value in host endian but
this has to be in big endian.

With this patch, if we add the same rule:

  nft add rule bridge filter input reject with icmp-host-unreach --debug netlink

  [ payload load 2b @ link header + 12 => reg 1 ]
  [ cmp eq reg 1 0x00000008 ]
  [ reject type 0 code 1 ]

The new dependency is converted to big endian.

Signed-off-by: Alvaro Neira Ayuso <alvaroneay@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/payload.c

index 1eee4e098052b9cb03d2d35fe6fa17527c506618..a3bbe51ebf4f84b42c15f30db8fca35e0f794d04 100644 (file)
@@ -216,8 +216,7 @@ int payload_gen_dependency(struct eval_ctx *ctx, const struct expr *expr,
                left = payload_expr_alloc(&expr->location, desc, desc->protocol_key);
 
        right = constant_expr_alloc(&expr->location, tmpl->dtype,
-                                   BYTEORDER_HOST_ENDIAN,
-                                   tmpl->len,
+                                   tmpl->dtype->byteorder, tmpl->len,
                                    constant_data_ptr(protocol, tmpl->len));
 
        dep = relational_expr_alloc(&expr->location, OP_EQ, left, right);