diff options
author | Chion Tang <sdspeedonion@gmail.com> | 2018-03-16 17:27:18 +0000 |
---|---|---|
committer | Chion Tang <sdspeedonion@gmail.com> | 2018-03-16 17:27:18 +0000 |
commit | f62f660b254192a3ac94e80a04995634a796d0e7 (patch) | |
tree | 6b8a8e41e949f5a4a38382f4d0be66bf6f91e59c | |
parent | feature: remove xt_FULLCONENAT-old-kernel.c and modify README (diff) | |
download | netfilter-full-cone-nat-f62f660b254192a3ac94e80a04995634a796d0e7.tar.gz netfilter-full-cone-nat-f62f660b254192a3ac94e80a04995634a796d0e7.tar.bz2 netfilter-full-cone-nat-f62f660b254192a3ac94e80a04995634a796d0e7.zip |
fix: multiple interface mapping leak
-rw-r--r-- | xt_FULLCONENAT.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/xt_FULLCONENAT.c b/xt_FULLCONENAT.c index 1242c04..22f1e0f 100644 --- a/xt_FULLCONENAT.c +++ b/xt_FULLCONENAT.c @@ -92,7 +92,7 @@ static char* nf_ct_stringify_tuple(const struct nf_conntrack_tuple *t) { return tuple_tmp_string; } -static struct nat_mapping* allocate_mapping(const uint16_t port, const __be32 int_addr, const uint16_t int_port, const int ifindex) { +static struct nat_mapping* allocate_mapping(const __be32 int_addr, const uint16_t int_port, const uint16_t port, const int ifindex) { struct nat_mapping *p_new; u32 hash_src; @@ -406,6 +406,7 @@ static unsigned int fullconenat_tg(struct sk_buff *skb, const struct xt_action_p ip = 0; original_port = 0; + src_mapping = NULL; mr = par->targinfo; range = &mr->range[0]; @@ -491,13 +492,14 @@ static unsigned int fullconenat_tg(struct sk_buff *skb, const struct xt_action_p /* if not, we find a new external port to map to. * the SNAT may fail so we should re-check the mapped port later. */ - want_port = find_appropriate_port(net, zone, original_port, ifindex, range); newrange.flags = NF_NAT_RANGE_MAP_IPS | NF_NAT_RANGE_PROTO_SPECIFIED; newrange.min_proto.udp.port = cpu_to_be16(want_port); newrange.max_proto = newrange.min_proto; + src_mapping = NULL; + } } @@ -522,9 +524,9 @@ static unsigned int fullconenat_tg(struct sk_buff *skb, const struct xt_action_p pr_debug("xt_FULLCONENAT: <OUTBOUND SNAT> %s ==> %d\n", nf_ct_stringify_tuple(ct_tuple_origin), port); /* save the mapping information into our mapping table */ - mapping = get_mapping_by_ext_port(port, ifindex); + mapping = src_mapping; if (mapping == NULL || !check_mapping(mapping, net, zone)) { - mapping = allocate_mapping(port, ip, original_port, ifindex); + mapping = allocate_mapping(ip, original_port, port, ifindex); } if (mapping != NULL) { add_original_tuple_to_mapping(mapping, ct_tuple_origin); |