diff options
author | Patrick McHardy <kaber@trash.net> | 2010-07-06 05:57:23 +0200 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2010-07-06 05:57:23 +0200 |
commit | ad20f4cfa59588a2214a8ecff2d20d75832c17e6 (patch) | |
tree | d6c2dccc63a403da204d74117305c414dd5b429a /src/netlink_delinearize.c | |
parent | 10ce8775690f890bc4f6546f2b306bc9f87b6fe2 (diff) |
netlink: fix nat stmt linearization/parsing
Fix invalid register use when parsing NAT statements and handle range expressions
during postprocessing. When linearizing, allocate all registers for both proto and
address expressions at once to avoid double use.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'src/netlink_delinearize.c')
-rw-r--r-- | src/netlink_delinearize.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c index a8f700aa..d75df215 100644 --- a/src/netlink_delinearize.c +++ b/src/netlink_delinearize.c @@ -408,14 +408,13 @@ static void netlink_parse_nat(struct netlink_parse_ctx *ctx, reg2 = nfnl_nft_nat_get_sreg_proto_max(nle); if (reg2 && reg2 != reg1) { - proto = netlink_get_register(ctx, loc, reg1); + proto = netlink_get_register(ctx, loc, reg2); if (proto == NULL) return netlink_error(ctx, loc, "NAT statement has no proto " "expression"); expr_set_type(proto, &inet_service_type, BYTEORDER_BIG_ENDIAN); - stmt->nat.proto = proto; if (stmt->nat.proto != NULL) proto = range_expr_alloc(loc, stmt->nat.proto, proto); stmt->nat.proto = proto; @@ -629,6 +628,10 @@ static void expr_postprocess(struct rule_pp_ctx *ctx, expr->len = len; } break; + case EXPR_RANGE: + expr_postprocess(ctx, stmt, &expr->left); + expr_postprocess(ctx, stmt, &expr->right); + break; case EXPR_SET_REF: case EXPR_EXTHDR: case EXPR_META: |