aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2010-02-19 08:24:39 -0500
committerPatrick McHardy <kaber@trash.net>2010-02-19 08:24:39 -0500
commita88e22adf5aad79b6e2ddd1bf0109c2ba8b46b0e (patch)
tree7085fe03c00deb268072f6b5145a03fa3405eab7 /net
parent4bac6b180771f7ef5275b1a6d88e630ca3a3d6f0 (diff)
netfilter: ctnetlink: fix creation of conntrack with helpers
This patch fixes a bug that triggers an assertion if you create a conntrack entry with a helper and netfilter debugging is enabled. Basically, we hit the assertion because the confirmation flag is set before the conntrack extensions are added. To fix this, we move the extension addition before the aforementioned flag is set. This patch also removes the possibility of setting a helper for existing conntracks. This operation would also trigger the assertion since we are not allowed to add new extensions for existing conntracks. We know noone that could benefit from this operation sanely. Thanks to Eric Dumazet for initial posting a preliminary patch to address this issue. Reported-by: David Ramblewski <David.Ramblewski@atosorigin.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'net')
-rw-r--r--net/netfilter/nf_conntrack_netlink.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c
index 8b05f364b2f2..2b2af631d2b8 100644
--- a/net/netfilter/nf_conntrack_netlink.c
+++ b/net/netfilter/nf_conntrack_netlink.c
@@ -1077,9 +1077,8 @@ ctnetlink_change_helper(struct nf_conn *ct, const struct nlattr * const cda[])
1077 /* need to zero data of old helper */ 1077 /* need to zero data of old helper */
1078 memset(&help->help, 0, sizeof(help->help)); 1078 memset(&help->help, 0, sizeof(help->help));
1079 } else { 1079 } else {
1080 help = nf_ct_helper_ext_add(ct, GFP_ATOMIC); 1080 /* we cannot set a helper for an existing conntrack */
1081 if (help == NULL) 1081 return -EOPNOTSUPP;
1082 return -ENOMEM;
1083 } 1082 }
1084 1083
1085 rcu_assign_pointer(help->helper, helper); 1084 rcu_assign_pointer(help->helper, helper);
@@ -1263,7 +1262,6 @@ ctnetlink_create_conntrack(struct net *net, u16 zone,
1263 ct->timeout.expires = ntohl(nla_get_be32(cda[CTA_TIMEOUT])); 1262 ct->timeout.expires = ntohl(nla_get_be32(cda[CTA_TIMEOUT]));
1264 1263
1265 ct->timeout.expires = jiffies + ct->timeout.expires * HZ; 1264 ct->timeout.expires = jiffies + ct->timeout.expires * HZ;
1266 ct->status |= IPS_CONFIRMED;
1267 1265
1268 rcu_read_lock(); 1266 rcu_read_lock();
1269 if (cda[CTA_HELP]) { 1267 if (cda[CTA_HELP]) {
@@ -1314,14 +1312,19 @@ ctnetlink_create_conntrack(struct net *net, u16 zone,
1314 goto err2; 1312 goto err2;
1315 } 1313 }
1316 1314
1317 if (cda[CTA_STATUS]) { 1315 if (cda[CTA_NAT_SRC] || cda[CTA_NAT_DST]) {
1318 err = ctnetlink_change_status(ct, cda); 1316 err = ctnetlink_change_nat(ct, cda);
1319 if (err < 0) 1317 if (err < 0)
1320 goto err2; 1318 goto err2;
1321 } 1319 }
1322 1320
1323 if (cda[CTA_NAT_SRC] || cda[CTA_NAT_DST]) { 1321 nf_ct_acct_ext_add(ct, GFP_ATOMIC);
1324 err = ctnetlink_change_nat(ct, cda); 1322 nf_ct_ecache_ext_add(ct, 0, 0, GFP_ATOMIC);
1323 /* we must add conntrack extensions before confirmation. */
1324 ct->status |= IPS_CONFIRMED;
1325
1326 if (cda[CTA_STATUS]) {
1327 err = ctnetlink_change_status(ct, cda);
1325 if (err < 0) 1328 if (err < 0)
1326 goto err2; 1329 goto err2;
1327 } 1330 }
@@ -1340,9 +1343,6 @@ ctnetlink_create_conntrack(struct net *net, u16 zone,
1340 goto err2; 1343 goto err2;
1341 } 1344 }
1342 1345
1343 nf_ct_acct_ext_add(ct, GFP_ATOMIC);
1344 nf_ct_ecache_ext_add(ct, 0, 0, GFP_ATOMIC);
1345
1346#if defined(CONFIG_NF_CONNTRACK_MARK) 1346#if defined(CONFIG_NF_CONNTRACK_MARK)
1347 if (cda[CTA_MARK]) 1347 if (cda[CTA_MARK])
1348 ct->mark = ntohl(nla_get_be32(cda[CTA_MARK])); 1348 ct->mark = ntohl(nla_get_be32(cda[CTA_MARK]));