Commit 927606a1 authored by David S. Miller's avatar David S. Miller
parents cf261b23 64507fdb
...@@ -212,8 +212,9 @@ NF_HOOK_COND(uint8_t pf, unsigned int hook, struct sk_buff *skb, ...@@ -212,8 +212,9 @@ NF_HOOK_COND(uint8_t pf, unsigned int hook, struct sk_buff *skb,
struct net_device *in, struct net_device *out, struct net_device *in, struct net_device *out,
int (*okfn)(struct sk_buff *), bool cond) int (*okfn)(struct sk_buff *), bool cond)
{ {
int ret = 1; int ret;
if (cond ||
if (!cond ||
(ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, INT_MIN) == 1)) (ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, INT_MIN) == 1))
ret = okfn(skb); ret = okfn(skb);
return ret; return ret;
......
...@@ -1077,9 +1077,8 @@ ctnetlink_change_helper(struct nf_conn *ct, const struct nlattr * const cda[]) ...@@ -1077,9 +1077,8 @@ ctnetlink_change_helper(struct nf_conn *ct, const struct nlattr * const cda[])
/* need to zero data of old helper */ /* need to zero data of old helper */
memset(&help->help, 0, sizeof(help->help)); memset(&help->help, 0, sizeof(help->help));
} else { } else {
help = nf_ct_helper_ext_add(ct, GFP_ATOMIC); /* we cannot set a helper for an existing conntrack */
if (help == NULL) return -EOPNOTSUPP;
return -ENOMEM;
} }
rcu_assign_pointer(help->helper, helper); rcu_assign_pointer(help->helper, helper);
...@@ -1263,7 +1262,6 @@ ctnetlink_create_conntrack(struct net *net, u16 zone, ...@@ -1263,7 +1262,6 @@ ctnetlink_create_conntrack(struct net *net, u16 zone,
ct->timeout.expires = ntohl(nla_get_be32(cda[CTA_TIMEOUT])); ct->timeout.expires = ntohl(nla_get_be32(cda[CTA_TIMEOUT]));
ct->timeout.expires = jiffies + ct->timeout.expires * HZ; ct->timeout.expires = jiffies + ct->timeout.expires * HZ;
ct->status |= IPS_CONFIRMED;
rcu_read_lock(); rcu_read_lock();
if (cda[CTA_HELP]) { if (cda[CTA_HELP]) {
...@@ -1314,14 +1312,19 @@ ctnetlink_create_conntrack(struct net *net, u16 zone, ...@@ -1314,14 +1312,19 @@ ctnetlink_create_conntrack(struct net *net, u16 zone,
goto err2; goto err2;
} }
if (cda[CTA_STATUS]) { if (cda[CTA_NAT_SRC] || cda[CTA_NAT_DST]) {
err = ctnetlink_change_status(ct, cda); err = ctnetlink_change_nat(ct, cda);
if (err < 0) if (err < 0)
goto err2; goto err2;
} }
if (cda[CTA_NAT_SRC] || cda[CTA_NAT_DST]) { nf_ct_acct_ext_add(ct, GFP_ATOMIC);
err = ctnetlink_change_nat(ct, cda); nf_ct_ecache_ext_add(ct, 0, 0, GFP_ATOMIC);
/* we must add conntrack extensions before confirmation. */
ct->status |= IPS_CONFIRMED;
if (cda[CTA_STATUS]) {
err = ctnetlink_change_status(ct, cda);
if (err < 0) if (err < 0)
goto err2; goto err2;
} }
...@@ -1340,9 +1343,6 @@ ctnetlink_create_conntrack(struct net *net, u16 zone, ...@@ -1340,9 +1343,6 @@ ctnetlink_create_conntrack(struct net *net, u16 zone,
goto err2; goto err2;
} }
nf_ct_acct_ext_add(ct, GFP_ATOMIC);
nf_ct_ecache_ext_add(ct, 0, 0, GFP_ATOMIC);
#if defined(CONFIG_NF_CONNTRACK_MARK) #if defined(CONFIG_NF_CONNTRACK_MARK)
if (cda[CTA_MARK]) if (cda[CTA_MARK])
ct->mark = ntohl(nla_get_be32(cda[CTA_MARK])); ct->mark = ntohl(nla_get_be32(cda[CTA_MARK]));
......
...@@ -265,7 +265,6 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict) ...@@ -265,7 +265,6 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
local_bh_disable(); local_bh_disable();
entry->okfn(skb); entry->okfn(skb);
local_bh_enable(); local_bh_enable();
case NF_STOLEN:
break; break;
case NF_QUEUE: case NF_QUEUE:
if (!__nf_queue(skb, elem, entry->pf, entry->hook, if (!__nf_queue(skb, elem, entry->pf, entry->hook,
...@@ -273,6 +272,7 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict) ...@@ -273,6 +272,7 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
verdict >> NF_VERDICT_BITS)) verdict >> NF_VERDICT_BITS))
goto next_hook; goto next_hook;
break; break;
case NF_STOLEN:
default: default:
kfree_skb(skb); kfree_skb(skb);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment