|
@@ -638,10 +638,9 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
- rcu_read_lock_bh();
|
|
|
|
- old_fp = rcu_dereference_bh(sk->sk_filter);
|
|
|
|
|
|
+ old_fp = rcu_dereference_protected(sk->sk_filter,
|
|
|
|
+ sock_owned_by_user(sk));
|
|
rcu_assign_pointer(sk->sk_filter, fp);
|
|
rcu_assign_pointer(sk->sk_filter, fp);
|
|
- rcu_read_unlock_bh();
|
|
|
|
|
|
|
|
if (old_fp)
|
|
if (old_fp)
|
|
sk_filter_delayed_uncharge(sk, old_fp);
|
|
sk_filter_delayed_uncharge(sk, old_fp);
|
|
@@ -654,14 +653,13 @@ int sk_detach_filter(struct sock *sk)
|
|
int ret = -ENOENT;
|
|
int ret = -ENOENT;
|
|
struct sk_filter *filter;
|
|
struct sk_filter *filter;
|
|
|
|
|
|
- rcu_read_lock_bh();
|
|
|
|
- filter = rcu_dereference_bh(sk->sk_filter);
|
|
|
|
|
|
+ filter = rcu_dereference_protected(sk->sk_filter,
|
|
|
|
+ sock_owned_by_user(sk));
|
|
if (filter) {
|
|
if (filter) {
|
|
rcu_assign_pointer(sk->sk_filter, NULL);
|
|
rcu_assign_pointer(sk->sk_filter, NULL);
|
|
sk_filter_delayed_uncharge(sk, filter);
|
|
sk_filter_delayed_uncharge(sk, filter);
|
|
ret = 0;
|
|
ret = 0;
|
|
}
|
|
}
|
|
- rcu_read_unlock_bh();
|
|
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(sk_detach_filter);
|
|
EXPORT_SYMBOL_GPL(sk_detach_filter);
|