Commit 43db362d authored by Maciej Żenczykowski's avatar Maciej Żenczykowski Committed by David S. Miller

net: get rid of some pointless casts to sockaddr

The following 4 functions:
  move_addr_to_kernel
  move_addr_to_user
  verify_iovec
  verify_compat_iovec
are always effectively called with a sockaddr_storage.

Make this explicit by changing their signature.

This removes a large number of casts from sockaddr_storage to sockaddr.
Signed-off-by: default avatarMaciej Żenczykowski <maze@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8b2aaede
...@@ -326,11 +326,11 @@ extern int csum_partial_copy_fromiovecend(unsigned char *kdata, ...@@ -326,11 +326,11 @@ extern int csum_partial_copy_fromiovecend(unsigned char *kdata,
int offset, int offset,
unsigned int len, __wsum *csump); unsigned int len, __wsum *csump);
extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode); extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *address, int mode);
extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len); extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len);
extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata,
int offset, int len); int offset, int len);
extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr); extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr);
extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);
struct timespec; struct timespec;
......
...@@ -41,7 +41,7 @@ extern int compat_sock_get_timestampns(struct sock *, struct timespec __user *); ...@@ -41,7 +41,7 @@ extern int compat_sock_get_timestampns(struct sock *, struct timespec __user *);
#endif /* defined(CONFIG_COMPAT) */ #endif /* defined(CONFIG_COMPAT) */
extern int get_compat_msghdr(struct msghdr *, struct compat_msghdr __user *); extern int get_compat_msghdr(struct msghdr *, struct compat_msghdr __user *);
extern int verify_compat_iovec(struct msghdr *, struct iovec *, struct sockaddr *, int); extern int verify_compat_iovec(struct msghdr *, struct iovec *, struct sockaddr_storage *, int);
extern asmlinkage long compat_sys_sendmsg(int,struct compat_msghdr __user *,unsigned); extern asmlinkage long compat_sys_sendmsg(int,struct compat_msghdr __user *,unsigned);
extern asmlinkage long compat_sys_sendmmsg(int, struct compat_mmsghdr __user *, extern asmlinkage long compat_sys_sendmmsg(int, struct compat_mmsghdr __user *,
unsigned, unsigned); unsigned, unsigned);
......
...@@ -79,7 +79,7 @@ int get_compat_msghdr(struct msghdr *kmsg, struct compat_msghdr __user *umsg) ...@@ -79,7 +79,7 @@ int get_compat_msghdr(struct msghdr *kmsg, struct compat_msghdr __user *umsg)
/* I've named the args so it is easy to tell whose space the pointers are in. */ /* I've named the args so it is easy to tell whose space the pointers are in. */
int verify_compat_iovec(struct msghdr *kern_msg, struct iovec *kern_iov, int verify_compat_iovec(struct msghdr *kern_msg, struct iovec *kern_iov,
struct sockaddr *kern_address, int mode) struct sockaddr_storage *kern_address, int mode)
{ {
int tot_len; int tot_len;
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
* in any case. * in any case.
*/ */
int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode) int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *address, int mode)
{ {
int size, ct, err; int size, ct, err;
......
...@@ -181,7 +181,7 @@ static DEFINE_PER_CPU(int, sockets_in_use); ...@@ -181,7 +181,7 @@ static DEFINE_PER_CPU(int, sockets_in_use);
* invalid addresses -EFAULT is returned. On a success 0 is returned. * 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)) if (ulen < 0 || ulen > sizeof(struct sockaddr_storage))
return -EINVAL; return -EINVAL;
...@@ -209,7 +209,7 @@ int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr) ...@@ -209,7 +209,7 @@ int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr)
* specified. Zero is returned for a success. * 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) void __user *uaddr, int __user *ulen)
{ {
int err; int err;
...@@ -1449,7 +1449,7 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen) ...@@ -1449,7 +1449,7 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
sock = sockfd_lookup_light(fd, &err, &fput_needed); sock = sockfd_lookup_light(fd, &err, &fput_needed);
if (sock) { if (sock) {
err = move_addr_to_kernel(umyaddr, addrlen, (struct sockaddr *)&address); err = move_addr_to_kernel(umyaddr, addrlen, &address);
if (err >= 0) { if (err >= 0) {
err = security_socket_bind(sock, err = security_socket_bind(sock,
(struct sockaddr *)&address, (struct sockaddr *)&address,
...@@ -1556,7 +1556,7 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, ...@@ -1556,7 +1556,7 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
err = -ECONNABORTED; err = -ECONNABORTED;
goto out_fd; goto out_fd;
} }
err = move_addr_to_user((struct sockaddr *)&address, err = move_addr_to_user(&address,
len, upeer_sockaddr, upeer_addrlen); len, upeer_sockaddr, upeer_addrlen);
if (err < 0) if (err < 0)
goto out_fd; goto out_fd;
...@@ -1605,7 +1605,7 @@ SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr, ...@@ -1605,7 +1605,7 @@ SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
sock = sockfd_lookup_light(fd, &err, &fput_needed); sock = sockfd_lookup_light(fd, &err, &fput_needed);
if (!sock) if (!sock)
goto out; goto out;
err = move_addr_to_kernel(uservaddr, addrlen, (struct sockaddr *)&address); err = move_addr_to_kernel(uservaddr, addrlen, &address);
if (err < 0) if (err < 0)
goto out_put; goto out_put;
...@@ -1645,7 +1645,7 @@ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr, ...@@ -1645,7 +1645,7 @@ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
err = sock->ops->getname(sock, (struct sockaddr *)&address, &len, 0); err = sock->ops->getname(sock, (struct sockaddr *)&address, &len, 0);
if (err) if (err)
goto out_put; 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: out_put:
fput_light(sock->file, fput_needed); fput_light(sock->file, fput_needed);
...@@ -1677,7 +1677,7 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr, ...@@ -1677,7 +1677,7 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
sock->ops->getname(sock, (struct sockaddr *)&address, &len, sock->ops->getname(sock, (struct sockaddr *)&address, &len,
1); 1);
if (!err) if (!err)
err = move_addr_to_user((struct sockaddr *)&address, len, usockaddr, err = move_addr_to_user(&address, len, usockaddr,
usockaddr_len); usockaddr_len);
fput_light(sock->file, fput_needed); fput_light(sock->file, fput_needed);
} }
...@@ -1716,7 +1716,7 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len, ...@@ -1716,7 +1716,7 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
msg.msg_controllen = 0; msg.msg_controllen = 0;
msg.msg_namelen = 0; msg.msg_namelen = 0;
if (addr) { 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) if (err < 0)
goto out_put; goto out_put;
msg.msg_name = (struct sockaddr *)&address; msg.msg_name = (struct sockaddr *)&address;
...@@ -1779,7 +1779,7 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size, ...@@ -1779,7 +1779,7 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
err = sock_recvmsg(sock, &msg, size, flags); err = sock_recvmsg(sock, &msg, size, flags);
if (err >= 0 && addr != NULL) { 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); msg.msg_namelen, addr, addr_len);
if (err2 < 0) if (err2 < 0)
err = err2; err = err2;
...@@ -1933,13 +1933,9 @@ static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg, ...@@ -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 */ /* This will also move the address data into kernel space */
if (MSG_CMSG_COMPAT & flags) { if (MSG_CMSG_COMPAT & flags) {
err = verify_compat_iovec(msg_sys, iov, err = verify_compat_iovec(msg_sys, iov, &address, VERIFY_READ);
(struct sockaddr *)&address,
VERIFY_READ);
} else } else
err = verify_iovec(msg_sys, iov, err = verify_iovec(msg_sys, iov, &address, VERIFY_READ);
(struct sockaddr *)&address,
VERIFY_READ);
if (err < 0) if (err < 0)
goto out_freeiov; goto out_freeiov;
total_len = err; total_len = err;
...@@ -2143,13 +2139,9 @@ static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg, ...@@ -2143,13 +2139,9 @@ static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg,
uaddr = (__force void __user *)msg_sys->msg_name; uaddr = (__force void __user *)msg_sys->msg_name;
uaddr_len = COMPAT_NAMELEN(msg); uaddr_len = COMPAT_NAMELEN(msg);
if (MSG_CMSG_COMPAT & flags) { if (MSG_CMSG_COMPAT & flags) {
err = verify_compat_iovec(msg_sys, iov, err = verify_compat_iovec(msg_sys, iov, &addr, VERIFY_WRITE);
(struct sockaddr *)&addr,
VERIFY_WRITE);
} else } else
err = verify_iovec(msg_sys, iov, err = verify_iovec(msg_sys, iov, &addr, VERIFY_WRITE);
(struct sockaddr *)&addr,
VERIFY_WRITE);
if (err < 0) if (err < 0)
goto out_freeiov; goto out_freeiov;
total_len = err; total_len = err;
...@@ -2166,7 +2158,7 @@ static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg, ...@@ -2166,7 +2158,7 @@ static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg,
len = err; len = err;
if (uaddr != NULL) { if (uaddr != NULL) {
err = move_addr_to_user((struct sockaddr *)&addr, err = move_addr_to_user(&addr,
msg_sys->msg_namelen, uaddr, msg_sys->msg_namelen, uaddr,
uaddr_len); uaddr_len);
if (err < 0) if (err < 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment