|
@@ -181,7 +181,7 @@ static DEFINE_PER_CPU(int, sockets_in_use);
|
|
|
* invalid addresses -EFAULT is returned. On a success 0 is returned.
|
|
|
*/
|
|
|
|
|
|
-int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr)
|
|
|
+int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr)
|
|
|
{
|
|
|
if (ulen < 0 || ulen > sizeof(struct sockaddr_storage))
|
|
|
return -EINVAL;
|
|
@@ -209,7 +209,7 @@ int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr)
|
|
|
* specified. Zero is returned for a success.
|
|
|
*/
|
|
|
|
|
|
-static int move_addr_to_user(struct sockaddr *kaddr, int klen,
|
|
|
+static int move_addr_to_user(struct sockaddr_storage *kaddr, int klen,
|
|
|
void __user *uaddr, int __user *ulen)
|
|
|
{
|
|
|
int err;
|
|
@@ -1449,7 +1449,7 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
|
|
|
|
|
|
sock = sockfd_lookup_light(fd, &err, &fput_needed);
|
|
|
if (sock) {
|
|
|
- err = move_addr_to_kernel(umyaddr, addrlen, (struct sockaddr *)&address);
|
|
|
+ err = move_addr_to_kernel(umyaddr, addrlen, &address);
|
|
|
if (err >= 0) {
|
|
|
err = security_socket_bind(sock,
|
|
|
(struct sockaddr *)&address,
|
|
@@ -1556,7 +1556,7 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
|
|
|
err = -ECONNABORTED;
|
|
|
goto out_fd;
|
|
|
}
|
|
|
- err = move_addr_to_user((struct sockaddr *)&address,
|
|
|
+ err = move_addr_to_user(&address,
|
|
|
len, upeer_sockaddr, upeer_addrlen);
|
|
|
if (err < 0)
|
|
|
goto out_fd;
|
|
@@ -1605,7 +1605,7 @@ SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
|
|
|
sock = sockfd_lookup_light(fd, &err, &fput_needed);
|
|
|
if (!sock)
|
|
|
goto out;
|
|
|
- err = move_addr_to_kernel(uservaddr, addrlen, (struct sockaddr *)&address);
|
|
|
+ err = move_addr_to_kernel(uservaddr, addrlen, &address);
|
|
|
if (err < 0)
|
|
|
goto out_put;
|
|
|
|
|
@@ -1645,7 +1645,7 @@ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
|
|
|
err = sock->ops->getname(sock, (struct sockaddr *)&address, &len, 0);
|
|
|
if (err)
|
|
|
goto out_put;
|
|
|
- err = move_addr_to_user((struct sockaddr *)&address, len, usockaddr, usockaddr_len);
|
|
|
+ err = move_addr_to_user(&address, len, usockaddr, usockaddr_len);
|
|
|
|
|
|
out_put:
|
|
|
fput_light(sock->file, fput_needed);
|
|
@@ -1677,7 +1677,7 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
|
|
|
sock->ops->getname(sock, (struct sockaddr *)&address, &len,
|
|
|
1);
|
|
|
if (!err)
|
|
|
- err = move_addr_to_user((struct sockaddr *)&address, len, usockaddr,
|
|
|
+ err = move_addr_to_user(&address, len, usockaddr,
|
|
|
usockaddr_len);
|
|
|
fput_light(sock->file, fput_needed);
|
|
|
}
|
|
@@ -1716,7 +1716,7 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
|
|
|
msg.msg_controllen = 0;
|
|
|
msg.msg_namelen = 0;
|
|
|
if (addr) {
|
|
|
- err = move_addr_to_kernel(addr, addr_len, (struct sockaddr *)&address);
|
|
|
+ err = move_addr_to_kernel(addr, addr_len, &address);
|
|
|
if (err < 0)
|
|
|
goto out_put;
|
|
|
msg.msg_name = (struct sockaddr *)&address;
|
|
@@ -1779,7 +1779,7 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
|
|
|
err = sock_recvmsg(sock, &msg, size, flags);
|
|
|
|
|
|
if (err >= 0 && addr != NULL) {
|
|
|
- err2 = move_addr_to_user((struct sockaddr *)&address,
|
|
|
+ err2 = move_addr_to_user(&address,
|
|
|
msg.msg_namelen, addr, addr_len);
|
|
|
if (err2 < 0)
|
|
|
err = err2;
|
|
@@ -1933,13 +1933,9 @@ static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg,
|
|
|
|
|
|
/* This will also move the address data into kernel space */
|
|
|
if (MSG_CMSG_COMPAT & flags) {
|
|
|
- err = verify_compat_iovec(msg_sys, iov,
|
|
|
- (struct sockaddr *)&address,
|
|
|
- VERIFY_READ);
|
|
|
+ err = verify_compat_iovec(msg_sys, iov, &address, VERIFY_READ);
|
|
|
} else
|
|
|
- err = verify_iovec(msg_sys, iov,
|
|
|
- (struct sockaddr *)&address,
|
|
|
- VERIFY_READ);
|
|
|
+ err = verify_iovec(msg_sys, iov, &address, VERIFY_READ);
|
|
|
if (err < 0)
|
|
|
goto out_freeiov;
|
|
|
total_len = err;
|
|
@@ -2143,13 +2139,9 @@ static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg,
|
|
|
uaddr = (__force void __user *)msg_sys->msg_name;
|
|
|
uaddr_len = COMPAT_NAMELEN(msg);
|
|
|
if (MSG_CMSG_COMPAT & flags) {
|
|
|
- err = verify_compat_iovec(msg_sys, iov,
|
|
|
- (struct sockaddr *)&addr,
|
|
|
- VERIFY_WRITE);
|
|
|
+ err = verify_compat_iovec(msg_sys, iov, &addr, VERIFY_WRITE);
|
|
|
} else
|
|
|
- err = verify_iovec(msg_sys, iov,
|
|
|
- (struct sockaddr *)&addr,
|
|
|
- VERIFY_WRITE);
|
|
|
+ err = verify_iovec(msg_sys, iov, &addr, VERIFY_WRITE);
|
|
|
if (err < 0)
|
|
|
goto out_freeiov;
|
|
|
total_len = err;
|
|
@@ -2166,7 +2158,7 @@ static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg,
|
|
|
len = err;
|
|
|
|
|
|
if (uaddr != NULL) {
|
|
|
- err = move_addr_to_user((struct sockaddr *)&addr,
|
|
|
+ err = move_addr_to_user(&addr,
|
|
|
msg_sys->msg_namelen, uaddr,
|
|
|
uaddr_len);
|
|
|
if (err < 0)
|