From 6b7cafcd3d9ae0d995965887cf0797cae8eb2ac6 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Mon, 27 Sep 2010 06:07:30 +0000 Subject: [PATCH] --- yaml --- r: 214777 b: refs/heads/master c: f91ff5b9ff529be8aac2039af63b2c8ea6cd6ebe h: refs/heads/master i: 214775: f5481b7871ef3a8a02358b9beef4ff0d86c32206 v: v3 --- [refs] | 2 +- trunk/net/core/filter.c | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index b45ad54f995a..15a17a66a475 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7fa7cb7109d07c29ab28bb877bc7049a0150dbe5 +refs/heads/master: f91ff5b9ff529be8aac2039af63b2c8ea6cd6ebe diff --git a/trunk/net/core/filter.c b/trunk/net/core/filter.c index 52b051f82a01..7adf50352918 100644 --- a/trunk/net/core/filter.c +++ b/trunk/net/core/filter.c @@ -638,10 +638,9 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk) 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_read_unlock_bh(); if (old_fp) sk_filter_delayed_uncharge(sk, old_fp); @@ -654,14 +653,13 @@ int sk_detach_filter(struct sock *sk) int ret = -ENOENT; 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) { rcu_assign_pointer(sk->sk_filter, NULL); sk_filter_delayed_uncharge(sk, filter); ret = 0; } - rcu_read_unlock_bh(); return ret; } EXPORT_SYMBOL_GPL(sk_detach_filter);