Skip to content

Commit f91ff5b

Browse files
Eric Dumazetdavem330
Eric Dumazet
authored andcommitted
net: sk_{detach|attach}_filter() rcu fixes
sk_attach_filter() and sk_detach_filter() are run with socket locked. Use the appropriate rcu_dereference_protected() instead of blocking BH, and rcu_dereference_bh(). There is no point adding BH prevention and memory barrier. Signed-off-by: Eric Dumazet <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7fa7cb7 commit f91ff5b

File tree

1 file changed

+4
-6
lines changed

1 file changed

+4
-6
lines changed

net/core/filter.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -638,10 +638,9 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
638638
return err;
639639
}
640640

641-
rcu_read_lock_bh();
642-
old_fp = rcu_dereference_bh(sk->sk_filter);
641+
old_fp = rcu_dereference_protected(sk->sk_filter,
642+
sock_owned_by_user(sk));
643643
rcu_assign_pointer(sk->sk_filter, fp);
644-
rcu_read_unlock_bh();
645644

646645
if (old_fp)
647646
sk_filter_delayed_uncharge(sk, old_fp);
@@ -654,14 +653,13 @@ int sk_detach_filter(struct sock *sk)
654653
int ret = -ENOENT;
655654
struct sk_filter *filter;
656655

657-
rcu_read_lock_bh();
658-
filter = rcu_dereference_bh(sk->sk_filter);
656+
filter = rcu_dereference_protected(sk->sk_filter,
657+
sock_owned_by_user(sk));
659658
if (filter) {
660659
rcu_assign_pointer(sk->sk_filter, NULL);
661660
sk_filter_delayed_uncharge(sk, filter);
662661
ret = 0;
663662
}
664-
rcu_read_unlock_bh();
665663
return ret;
666664
}
667665
EXPORT_SYMBOL_GPL(sk_detach_filter);

0 commit comments

Comments
 (0)