|
|
@@ -1510,23 +1510,29 @@ static int ctnetlink_change_helper(struct nf_conn *ct,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ rcu_read_lock();
|
|
|
helper = __nf_conntrack_helper_find(helpname, nf_ct_l3num(ct),
|
|
|
nf_ct_protonum(ct));
|
|
|
- if (helper == NULL)
|
|
|
+ if (helper == NULL) {
|
|
|
+ rcu_read_unlock();
|
|
|
return -EOPNOTSUPP;
|
|
|
+ }
|
|
|
|
|
|
if (help) {
|
|
|
if (help->helper == helper) {
|
|
|
/* update private helper data if allowed. */
|
|
|
if (helper->from_nlattr)
|
|
|
helper->from_nlattr(helpinfo, ct);
|
|
|
- return 0;
|
|
|
+ err = 0;
|
|
|
} else
|
|
|
- return -EBUSY;
|
|
|
+ err = -EBUSY;
|
|
|
+ } else {
|
|
|
+ /* we cannot set a helper for an existing conntrack */
|
|
|
+ err = -EOPNOTSUPP;
|
|
|
}
|
|
|
|
|
|
- /* we cannot set a helper for an existing conntrack */
|
|
|
- return -EOPNOTSUPP;
|
|
|
+ rcu_read_unlock();
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static int ctnetlink_change_timeout(struct nf_conn *ct,
|
|
|
@@ -1945,9 +1951,7 @@ static int ctnetlink_new_conntrack(struct net *net, struct sock *ctnl,
|
|
|
err = -EEXIST;
|
|
|
ct = nf_ct_tuplehash_to_ctrack(h);
|
|
|
if (!(nlh->nlmsg_flags & NLM_F_EXCL)) {
|
|
|
- spin_lock_bh(&nf_conntrack_expect_lock);
|
|
|
err = ctnetlink_change_conntrack(ct, cda);
|
|
|
- spin_unlock_bh(&nf_conntrack_expect_lock);
|
|
|
if (err == 0) {
|
|
|
nf_conntrack_eventmask_report((1 << IPCT_REPLY) |
|
|
|
(1 << IPCT_ASSURED) |
|
|
|
@@ -2342,11 +2346,7 @@ ctnetlink_glue_parse(const struct nlattr *attr, struct nf_conn *ct)
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
|
|
|
- spin_lock_bh(&nf_conntrack_expect_lock);
|
|
|
- ret = ctnetlink_glue_parse_ct((const struct nlattr **)cda, ct);
|
|
|
- spin_unlock_bh(&nf_conntrack_expect_lock);
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return ctnetlink_glue_parse_ct((const struct nlattr **)cda, ct);
|
|
|
}
|
|
|
|
|
|
static int ctnetlink_glue_exp_parse(const struct nlattr * const *cda,
|