]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
netlink_linearize: generate concat expressions
authorPatrick McHardy <kaber@trash.net>
Mon, 13 Apr 2015 11:19:12 +0000 (12:19 +0100)
committerPatrick McHardy <kaber@trash.net>
Tue, 2 Jun 2015 11:03:58 +0000 (13:03 +0200)
Use the real length for reserving/releasing registers when generating
concat expressions.

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

index 6930b39da07f52fdda9163e32e310a8234ffb064..bf1e56be74a1a272e9f9c2e629786b28accc89a9 100644 (file)
@@ -68,13 +68,19 @@ static void __release_register(struct netlink_linearize_ctx *ctx,
 static enum nft_registers get_register(struct netlink_linearize_ctx *ctx,
                                       const struct expr *expr)
 {
-       return __get_register(ctx, NFT_REG_SIZE * BITS_PER_BYTE);
+       if (expr && expr->ops->type == EXPR_CONCAT)
+               return __get_register(ctx, expr->len);
+       else
+               return __get_register(ctx, NFT_REG_SIZE * BITS_PER_BYTE);
 }
 
 static void release_register(struct netlink_linearize_ctx *ctx,
                             const struct expr *expr)
 {
-       __release_register(ctx, NFT_REG_SIZE * BITS_PER_BYTE);
+       if (expr && expr->ops->type == EXPR_CONCAT)
+               __release_register(ctx, expr->len);
+       else
+               __release_register(ctx, NFT_REG_SIZE * BITS_PER_BYTE);
 }
 
 static void netlink_gen_expr(struct netlink_linearize_ctx *ctx,
@@ -87,8 +93,10 @@ static void netlink_gen_concat(struct netlink_linearize_ctx *ctx,
 {
        const struct expr *i;
 
-       list_for_each_entry(i, &expr->expressions, list)
+       list_for_each_entry(i, &expr->expressions, list) {
                netlink_gen_expr(ctx, i, dreg);
+               dreg += netlink_register_space(i->len);
+       }
 }
 
 static void netlink_gen_payload(struct netlink_linearize_ctx *ctx,