diff options
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 33 | 
1 files changed, 25 insertions, 8 deletions
| diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 67e87db5877f..774babbee045 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -284,11 +284,9 @@ static struct sock *__unix_find_socket_byname(struct net *net,  		if (u->addr->len == len &&  		    !memcmp(u->addr->name, sunname, len)) -			goto found; +			return s;  	} -	s = NULL; -found: -	return s; +	return NULL;  }  static inline struct sock *unix_find_socket_byname(struct net *net, @@ -646,6 +644,9 @@ static __poll_t unix_poll(struct file *, struct socket *, poll_table *);  static __poll_t unix_dgram_poll(struct file *, struct socket *,  				    poll_table *);  static int unix_ioctl(struct socket *, unsigned int, unsigned long); +#ifdef CONFIG_COMPAT +static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); +#endif  static int unix_shutdown(struct socket *, int);  static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t);  static int unix_stream_recvmsg(struct socket *, struct msghdr *, size_t, int); @@ -687,6 +688,9 @@ static const struct proto_ops unix_stream_ops = {  	.getname =	unix_getname,  	.poll =		unix_poll,  	.ioctl =	unix_ioctl, +#ifdef CONFIG_COMPAT +	.compat_ioctl =	unix_compat_ioctl, +#endif  	.listen =	unix_listen,  	.shutdown =	unix_shutdown,  	.setsockopt =	sock_no_setsockopt, @@ -710,6 +714,9 @@ static const struct proto_ops unix_dgram_ops = {  	.getname =	unix_getname,  	.poll =		unix_dgram_poll,  	.ioctl =	unix_ioctl, +#ifdef CONFIG_COMPAT +	.compat_ioctl =	unix_compat_ioctl, +#endif  	.listen =	sock_no_listen,  	.shutdown =	unix_shutdown,  	.setsockopt =	sock_no_setsockopt, @@ -732,6 +739,9 @@ static const struct proto_ops unix_seqpacket_ops = {  	.getname =	unix_getname,  	.poll =		unix_dgram_poll,  	.ioctl =	unix_ioctl, +#ifdef CONFIG_COMPAT +	.compat_ioctl =	unix_compat_ioctl, +#endif  	.listen =	unix_listen,  	.shutdown =	unix_shutdown,  	.setsockopt =	sock_no_setsockopt, @@ -2582,6 +2592,13 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)  	return err;  } +#ifdef CONFIG_COMPAT +static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) +{ +	return unix_ioctl(sock, cmd, (unsigned long)compat_ptr(arg)); +} +#endif +  static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wait)  {  	struct sock *sk = sock->sk; @@ -2599,7 +2616,7 @@ static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wa  		mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;  	/* readable? */ -	if (!skb_queue_empty(&sk->sk_receive_queue)) +	if (!skb_queue_empty_lockless(&sk->sk_receive_queue))  		mask |= EPOLLIN | EPOLLRDNORM;  	/* Connection-based need to check for termination and startup */ @@ -2628,7 +2645,7 @@ static __poll_t unix_dgram_poll(struct file *file, struct socket *sock,  	mask = 0;  	/* exceptional events? */ -	if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) +	if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue))  		mask |= EPOLLERR |  			(sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? EPOLLPRI : 0); @@ -2638,7 +2655,7 @@ static __poll_t unix_dgram_poll(struct file *file, struct socket *sock,  		mask |= EPOLLHUP;  	/* readable? */ -	if (!skb_queue_empty(&sk->sk_receive_queue)) +	if (!skb_queue_empty_lockless(&sk->sk_receive_queue))  		mask |= EPOLLIN | EPOLLRDNORM;  	/* Connection-based need to check for termination and startup */ @@ -2848,7 +2865,7 @@ static int __init af_unix_init(void)  {  	int rc = -1; -	BUILD_BUG_ON(sizeof(struct unix_skb_parms) > FIELD_SIZEOF(struct sk_buff, cb)); +	BUILD_BUG_ON(sizeof(struct unix_skb_parms) > sizeof_field(struct sk_buff, cb));  	rc = proto_register(&unix_proto, 1);  	if (rc != 0) { |