aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Chion Tang <sdspeedonion@gmail.com> 2018-03-16 17:27:18 +0000
committerGravatar Chion Tang <sdspeedonion@gmail.com> 2018-03-16 17:27:18 +0000
commitf62f660b254192a3ac94e80a04995634a796d0e7 (patch)
tree6b8a8e41e949f5a4a38382f4d0be66bf6f91e59c
parentfeature: remove xt_FULLCONENAT-old-kernel.c and modify README (diff)
downloadnetfilter-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.c10
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);