diff options
| author | David S. Miller <davem@davemloft.net> | 2013-11-04 19:48:57 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-11-04 19:48:57 -0500 |
| commit | f8785c55141d698d988c6a1ffe4530bc7fa6e886 (patch) | |
| tree | dc629fe50865a6f3e5e47eaf8c4a9e3e1995bbec | |
| parent | 72c39a0ade6229a938736fe1aa1d5e471fc7face (diff) | |
| parent | c359c4157cf0d852387aff2f2d83fef039aadc2c (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nftables
Pablo Neira Ayuso says:
====================
This batch contains fives nf_tables patches for your net-next tree,
they are:
* Fix possible use after free in the module removal path of the
x_tables compatibility layer, from Dan Carpenter.
* Add filter chain type for the bridge family, from myself.
* Fix Kconfig dependencies of the nf_tables bridge family with
the core, from myself.
* Fix sparse warnings in nft_nat, from Tomasz Bursztyka.
* Remove duplicated include in the IPv4 family support for nf_tables,
from Wei Yongjun.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/bridge/netfilter/Kconfig | 1 | ||||
| -rw-r--r-- | net/bridge/netfilter/nf_tables_bridge.c | 41 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nf_tables_ipv4.c | 1 | ||||
| -rw-r--r-- | net/netfilter/nft_compat.c | 8 | ||||
| -rw-r--r-- | net/netfilter/nft_nat.c | 12 |
5 files changed, 52 insertions, 11 deletions
diff --git a/net/bridge/netfilter/Kconfig b/net/bridge/netfilter/Kconfig index 68f8128147be..5ca74a0e595f 100644 --- a/net/bridge/netfilter/Kconfig +++ b/net/bridge/netfilter/Kconfig | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | # | 3 | # |
| 4 | # | 4 | # |
| 5 | config NF_TABLES_BRIDGE | 5 | config NF_TABLES_BRIDGE |
| 6 | depends on NF_TABLES | ||
| 6 | tristate "Ethernet Bridge nf_tables support" | 7 | tristate "Ethernet Bridge nf_tables support" |
| 7 | 8 | ||
| 8 | menuconfig BRIDGE_NF_EBTABLES | 9 | menuconfig BRIDGE_NF_EBTABLES |
diff --git a/net/bridge/netfilter/nf_tables_bridge.c b/net/bridge/netfilter/nf_tables_bridge.c index e8cb016fa34d..cf54b22818c8 100644 --- a/net/bridge/netfilter/nf_tables_bridge.c +++ b/net/bridge/netfilter/nf_tables_bridge.c | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2008 Patrick McHardy <kaber@trash.net> | 2 | * Copyright (c) 2008 Patrick McHardy <kaber@trash.net> |
| 3 | * Copyright (c) 2013 Pablo Neira Ayuso <pablo@netfilter.org> | ||
| 3 | * | 4 | * |
| 4 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| 5 | * it under the terms of the GNU General Public License version 2 as | 6 | * it under the terms of the GNU General Public License version 2 as |
| @@ -47,14 +48,50 @@ static struct pernet_operations nf_tables_bridge_net_ops = { | |||
| 47 | .exit = nf_tables_bridge_exit_net, | 48 | .exit = nf_tables_bridge_exit_net, |
| 48 | }; | 49 | }; |
| 49 | 50 | ||
| 51 | static unsigned int | ||
| 52 | nft_do_chain_bridge(const struct nf_hook_ops *ops, | ||
| 53 | struct sk_buff *skb, | ||
| 54 | const struct net_device *in, | ||
| 55 | const struct net_device *out, | ||
| 56 | int (*okfn)(struct sk_buff *)) | ||
| 57 | { | ||
| 58 | struct nft_pktinfo pkt; | ||
| 59 | |||
| 60 | nft_set_pktinfo(&pkt, ops, skb, in, out); | ||
| 61 | |||
| 62 | return nft_do_chain_pktinfo(&pkt, ops); | ||
| 63 | } | ||
| 64 | |||
| 65 | static struct nf_chain_type filter_bridge = { | ||
| 66 | .family = NFPROTO_BRIDGE, | ||
| 67 | .name = "filter", | ||
| 68 | .type = NFT_CHAIN_T_DEFAULT, | ||
| 69 | .hook_mask = (1 << NF_BR_LOCAL_IN) | | ||
| 70 | (1 << NF_BR_FORWARD) | | ||
| 71 | (1 << NF_BR_LOCAL_OUT), | ||
| 72 | .fn = { | ||
| 73 | [NF_BR_LOCAL_IN] = nft_do_chain_bridge, | ||
| 74 | [NF_BR_FORWARD] = nft_do_chain_bridge, | ||
| 75 | [NF_BR_LOCAL_OUT] = nft_do_chain_bridge, | ||
| 76 | }, | ||
| 77 | }; | ||
| 78 | |||
| 50 | static int __init nf_tables_bridge_init(void) | 79 | static int __init nf_tables_bridge_init(void) |
| 51 | { | 80 | { |
| 52 | return register_pernet_subsys(&nf_tables_bridge_net_ops); | 81 | int ret; |
| 82 | |||
| 83 | nft_register_chain_type(&filter_bridge); | ||
| 84 | ret = register_pernet_subsys(&nf_tables_bridge_net_ops); | ||
| 85 | if (ret < 0) | ||
| 86 | nft_unregister_chain_type(&filter_bridge); | ||
| 87 | |||
| 88 | return ret; | ||
| 53 | } | 89 | } |
| 54 | 90 | ||
| 55 | static void __exit nf_tables_bridge_exit(void) | 91 | static void __exit nf_tables_bridge_exit(void) |
| 56 | { | 92 | { |
| 57 | return unregister_pernet_subsys(&nf_tables_bridge_net_ops); | 93 | unregister_pernet_subsys(&nf_tables_bridge_net_ops); |
| 94 | nft_unregister_chain_type(&filter_bridge); | ||
| 58 | } | 95 | } |
| 59 | 96 | ||
| 60 | module_init(nf_tables_bridge_init); | 97 | module_init(nf_tables_bridge_init); |
diff --git a/net/ipv4/netfilter/nf_tables_ipv4.c b/net/ipv4/netfilter/nf_tables_ipv4.c index 8f7536be1322..0f4cbfeb19bd 100644 --- a/net/ipv4/netfilter/nf_tables_ipv4.c +++ b/net/ipv4/netfilter/nf_tables_ipv4.c | |||
| @@ -16,7 +16,6 @@ | |||
| 16 | #include <net/netfilter/nf_tables.h> | 16 | #include <net/netfilter/nf_tables.h> |
| 17 | #include <net/net_namespace.h> | 17 | #include <net/net_namespace.h> |
| 18 | #include <net/ip.h> | 18 | #include <net/ip.h> |
| 19 | #include <net/net_namespace.h> | ||
| 20 | #include <net/netfilter/nf_tables_ipv4.h> | 19 | #include <net/netfilter/nf_tables_ipv4.h> |
| 21 | 20 | ||
| 22 | static unsigned int nft_ipv4_output(const struct nf_hook_ops *ops, | 21 | static unsigned int nft_ipv4_output(const struct nf_hook_ops *ops, |
diff --git a/net/netfilter/nft_compat.c b/net/netfilter/nft_compat.c index 4811f762e060..a82667c64729 100644 --- a/net/netfilter/nft_compat.c +++ b/net/netfilter/nft_compat.c | |||
| @@ -634,9 +634,9 @@ nft_match_select_ops(const struct nft_ctx *ctx, | |||
| 634 | 634 | ||
| 635 | static void nft_match_release(void) | 635 | static void nft_match_release(void) |
| 636 | { | 636 | { |
| 637 | struct nft_xt *nft_match; | 637 | struct nft_xt *nft_match, *tmp; |
| 638 | 638 | ||
| 639 | list_for_each_entry(nft_match, &nft_match_list, head) | 639 | list_for_each_entry_safe(nft_match, tmp, &nft_match_list, head) |
| 640 | kfree(nft_match); | 640 | kfree(nft_match); |
| 641 | } | 641 | } |
| 642 | 642 | ||
| @@ -705,9 +705,9 @@ nft_target_select_ops(const struct nft_ctx *ctx, | |||
| 705 | 705 | ||
| 706 | static void nft_target_release(void) | 706 | static void nft_target_release(void) |
| 707 | { | 707 | { |
| 708 | struct nft_xt *nft_target; | 708 | struct nft_xt *nft_target, *tmp; |
| 709 | 709 | ||
| 710 | list_for_each_entry(nft_target, &nft_target_list, head) | 710 | list_for_each_entry_safe(nft_target, tmp, &nft_target_list, head) |
| 711 | kfree(nft_target); | 711 | kfree(nft_target); |
| 712 | } | 712 | } |
| 713 | 713 | ||
diff --git a/net/netfilter/nft_nat.c b/net/netfilter/nft_nat.c index b0b87b2d2411..d3b1ffe26181 100644 --- a/net/netfilter/nft_nat.c +++ b/net/netfilter/nft_nat.c | |||
| @@ -47,8 +47,10 @@ static void nft_nat_eval(const struct nft_expr *expr, | |||
| 47 | memset(&range, 0, sizeof(range)); | 47 | memset(&range, 0, sizeof(range)); |
| 48 | if (priv->sreg_addr_min) { | 48 | if (priv->sreg_addr_min) { |
| 49 | if (priv->family == AF_INET) { | 49 | if (priv->family == AF_INET) { |
| 50 | range.min_addr.ip = data[priv->sreg_addr_min].data[0]; | 50 | range.min_addr.ip = (__force __be32) |
| 51 | range.max_addr.ip = data[priv->sreg_addr_max].data[0]; | 51 | data[priv->sreg_addr_min].data[0]; |
| 52 | range.max_addr.ip = (__force __be32) | ||
| 53 | data[priv->sreg_addr_max].data[0]; | ||
| 52 | 54 | ||
| 53 | } else { | 55 | } else { |
| 54 | memcpy(range.min_addr.ip6, | 56 | memcpy(range.min_addr.ip6, |
| @@ -62,8 +64,10 @@ static void nft_nat_eval(const struct nft_expr *expr, | |||
| 62 | } | 64 | } |
| 63 | 65 | ||
| 64 | if (priv->sreg_proto_min) { | 66 | if (priv->sreg_proto_min) { |
| 65 | range.min_proto.all = data[priv->sreg_proto_min].data[0]; | 67 | range.min_proto.all = (__force __be16) |
| 66 | range.max_proto.all = data[priv->sreg_proto_max].data[0]; | 68 | data[priv->sreg_proto_min].data[0]; |
| 69 | range.max_proto.all = (__force __be16) | ||
| 70 | data[priv->sreg_proto_max].data[0]; | ||
| 67 | range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED; | 71 | range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED; |
| 68 | } | 72 | } |
| 69 | 73 | ||
