From 40d23944773ff571dfcde8dbea811d3f84763a59 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Wed, 17 Oct 2007 21:22:17 -0700 Subject: [PATCH] --- yaml --- r: 71279 b: refs/heads/master c: d3904b739928edd83d117f1eb5bfa69f18d6f046 h: refs/heads/master i: 71277: fd678b0a8f2b5d63b4934db8e8c77df3f437b5fe 71275: 8f65b6927fa3c95d4e2cef41c9edd78604d9cf2f 71271: 6bda049aaf84bb1db2f53a9dd785bc30e0039946 71263: 7724e2d30328839e4f67475a010b2624d9337e9e v: v3 --- [refs] | 2 +- trunk/net/core/filter.c | 23 +++++++++++------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index 9a7da8e6b799..21af397f82d7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 309dd5fc872448e35634d510049642312ebc170d +refs/heads/master: d3904b739928edd83d117f1eb5bfa69f18d6f046 diff --git a/trunk/net/core/filter.c b/trunk/net/core/filter.c index 2be1830d3c35..54dddc92452d 100644 --- a/trunk/net/core/filter.c +++ b/trunk/net/core/filter.c @@ -398,7 +398,7 @@ int sk_chk_filter(struct sock_filter *filter, int flen) */ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk) { - struct sk_filter *fp; + struct sk_filter *fp, *old_fp; unsigned int fsize = sizeof(struct sock_filter) * fprog->len; int err; @@ -418,19 +418,18 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk) fp->len = fprog->len; err = sk_chk_filter(fp->insns, fp->len); - if (!err) { - struct sk_filter *old_fp; - - rcu_read_lock_bh(); - old_fp = rcu_dereference(sk->sk_filter); - rcu_assign_pointer(sk->sk_filter, fp); - rcu_read_unlock_bh(); - fp = old_fp; + if (err) { + sk_filter_uncharge(sk, fp); + return err; } - if (fp) - sk_filter_uncharge(sk, fp); - return err; + rcu_read_lock_bh(); + old_fp = rcu_dereference(sk->sk_filter); + rcu_assign_pointer(sk->sk_filter, fp); + rcu_read_unlock_bh(); + + sk_filter_uncharge(sk, old_fp); + return 0; } int sk_detach_filter(struct sock *sk)