diff options
Diffstat (limited to 'net/socket.c')
| -rw-r--r-- | net/socket.c | 17 | 
1 files changed, 11 insertions, 6 deletions
diff --git a/net/socket.c b/net/socket.c index 879933aaed4c..a19ae1968d37 100644 --- a/net/socket.c +++ b/net/socket.c @@ -450,16 +450,17 @@ EXPORT_SYMBOL(sockfd_lookup);  static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed)  { -	struct file *file; +	struct fd f = fdget(fd);  	struct socket *sock;  	*err = -EBADF; -	file = fget_light(fd, fput_needed); -	if (file) { -		sock = sock_from_file(file, err); -		if (sock) +	if (f.file) { +		sock = sock_from_file(f.file, err); +		if (likely(sock)) { +			*fput_needed = f.flags;  			return sock; -		fput_light(file, *fput_needed); +		} +		fdput(f);  	}  	return NULL;  } @@ -1985,6 +1986,10 @@ static int copy_msghdr_from_user(struct msghdr *kmsg,  {  	if (copy_from_user(kmsg, umsg, sizeof(struct msghdr)))  		return -EFAULT; + +	if (kmsg->msg_namelen < 0) +		return -EINVAL; +  	if (kmsg->msg_namelen > sizeof(struct sockaddr_storage))  		kmsg->msg_namelen = sizeof(struct sockaddr_storage);  	return 0;  | 
