|
@@ -1684,13 +1684,16 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
|
|
|
|
|
|
sock_reset_flag(newsk, SOCK_DONE);
|
|
|
|
|
|
- filter = rcu_dereference_protected(newsk->sk_filter, 1);
|
|
|
+ rcu_read_lock();
|
|
|
+ filter = rcu_dereference(sk->sk_filter);
|
|
|
if (filter != NULL)
|
|
|
/* though it's an empty new sock, the charging may fail
|
|
|
* if sysctl_optmem_max was changed between creation of
|
|
|
* original socket and cloning
|
|
|
*/
|
|
|
is_charged = sk_filter_charge(newsk, filter);
|
|
|
+ RCU_INIT_POINTER(newsk->sk_filter, filter);
|
|
|
+ rcu_read_unlock();
|
|
|
|
|
|
if (unlikely(!is_charged || xfrm_sk_clone_policy(newsk, sk))) {
|
|
|
/* We need to make sure that we don't uncharge the new
|