aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-03-21 19:12:32 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-04-09 00:02:21 -0400
commit602bd0e90e14c0b50246b361290dbbbe551ada98 (patch)
treebf8444fd9daa75c35c71a4dc118f7270c3f618f6 /net/socket.c
parentfe3cce2e01ef7a2796c9674b1ec3a28a85f53547 (diff)
net: switch sendto() and recvfrom() to import_single_range()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c24
1 files changed, 8 insertions, 16 deletions
diff --git a/net/socket.c b/net/socket.c
index 989b1ae32afa..46f0e1d752b3 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1650,18 +1650,14 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
1650 struct iovec iov; 1650 struct iovec iov;
1651 int fput_needed; 1651 int fput_needed;
1652 1652
1653 if (len > INT_MAX) 1653 err = import_single_range(WRITE, buff, len, &iov, &msg.msg_iter);
1654 len = INT_MAX; 1654 if (unlikely(err))
1655 if (unlikely(!access_ok(VERIFY_READ, buff, len))) 1655 return err;
1656 return -EFAULT;
1657 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1656 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1658 if (!sock) 1657 if (!sock)
1659 goto out; 1658 goto out;
1660 1659
1661 iov.iov_base = buff;
1662 iov.iov_len = len;
1663 msg.msg_name = NULL; 1660 msg.msg_name = NULL;
1664 iov_iter_init(&msg.msg_iter, WRITE, &iov, 1, len);
1665 msg.msg_control = NULL; 1661 msg.msg_control = NULL;
1666 msg.msg_controllen = 0; 1662 msg.msg_controllen = 0;
1667 msg.msg_namelen = 0; 1663 msg.msg_namelen = 0;
@@ -1675,7 +1671,7 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
1675 if (sock->file->f_flags & O_NONBLOCK) 1671 if (sock->file->f_flags & O_NONBLOCK)
1676 flags |= MSG_DONTWAIT; 1672 flags |= MSG_DONTWAIT;
1677 msg.msg_flags = flags; 1673 msg.msg_flags = flags;
1678 err = sock_sendmsg(sock, &msg, len); 1674 err = sock_sendmsg(sock, &msg, iov_iter_count(&msg.msg_iter));
1679 1675
1680out_put: 1676out_put:
1681 fput_light(sock->file, fput_needed); 1677 fput_light(sock->file, fput_needed);
@@ -1710,26 +1706,22 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
1710 int err, err2; 1706 int err, err2;
1711 int fput_needed; 1707 int fput_needed;
1712 1708
1713 if (size > INT_MAX) 1709 err = import_single_range(READ, ubuf, size, &iov, &msg.msg_iter);
1714 size = INT_MAX; 1710 if (unlikely(err))
1715 if (unlikely(!access_ok(VERIFY_WRITE, ubuf, size))) 1711 return err;
1716 return -EFAULT;
1717 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1712 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1718 if (!sock) 1713 if (!sock)
1719 goto out; 1714 goto out;
1720 1715
1721 msg.msg_control = NULL; 1716 msg.msg_control = NULL;
1722 msg.msg_controllen = 0; 1717 msg.msg_controllen = 0;
1723 iov.iov_len = size;
1724 iov.iov_base = ubuf;
1725 iov_iter_init(&msg.msg_iter, READ, &iov, 1, size);
1726 /* Save some cycles and don't copy the address if not needed */ 1718 /* Save some cycles and don't copy the address if not needed */
1727 msg.msg_name = addr ? (struct sockaddr *)&address : NULL; 1719 msg.msg_name = addr ? (struct sockaddr *)&address : NULL;
1728 /* We assume all kernel code knows the size of sockaddr_storage */ 1720 /* We assume all kernel code knows the size of sockaddr_storage */
1729 msg.msg_namelen = 0; 1721 msg.msg_namelen = 0;
1730 if (sock->file->f_flags & O_NONBLOCK) 1722 if (sock->file->f_flags & O_NONBLOCK)
1731 flags |= MSG_DONTWAIT; 1723 flags |= MSG_DONTWAIT;
1732 err = sock_recvmsg(sock, &msg, size, flags); 1724 err = sock_recvmsg(sock, &msg, iov_iter_count(&msg.msg_iter), flags);
1733 1725
1734 if (err >= 0 && addr != NULL) { 1726 if (err >= 0 && addr != NULL) {
1735 err2 = move_addr_to_user(&address, 1727 err2 = move_addr_to_user(&address,