Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 55b33325 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller
Browse files

[NET]: Introduce the sk_detach_filter() call



Filter is attached in a separate function, so do the
same for filter detaching.

This also removes one variable sock_setsockopt().

Signed-off-by: default avatarPavel Emelyanov <xemul@openvz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d114f399
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -146,6 +146,7 @@ struct sock;

extern unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen);
extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk);
extern int sk_detach_filter(struct sock *sk);
extern int sk_chk_filter(struct sock_filter *filter, int flen);
#endif /* __KERNEL__ */

+16 −0
Original line number Diff line number Diff line
@@ -433,5 +433,21 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
	return err;
}

int sk_detach_filter(struct sock *sk)
{
	int ret = -ENOENT;
	struct sk_filter *filter;

	rcu_read_lock_bh();
	filter = rcu_dereference(sk->sk_filter);
	if (filter) {
		rcu_assign_pointer(sk->sk_filter, NULL);
		sk_filter_release(sk, filter);
		ret = 0;
	}
	rcu_read_unlock_bh();
	return ret;
}

EXPORT_SYMBOL(sk_chk_filter);
EXPORT_SYMBOL(sk_run_filter);
+1 −11
Original line number Diff line number Diff line
@@ -428,7 +428,6 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
		    char __user *optval, int optlen)
{
	struct sock *sk=sock->sk;
	struct sk_filter *filter;
	int val;
	int valbool;
	struct linger ling;
@@ -652,16 +651,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
		break;

	case SO_DETACH_FILTER:
		rcu_read_lock_bh();
		filter = rcu_dereference(sk->sk_filter);
		if (filter) {
			rcu_assign_pointer(sk->sk_filter, NULL);
			sk_filter_release(sk, filter);
			rcu_read_unlock_bh();
			break;
		}
		rcu_read_unlock_bh();
		ret = -ENONET;
		ret = sk_detach_filter(sk);
		break;

	case SO_PASSSEC: