diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-03-21 19:12:32 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-09 00:02:21 -0400 |
commit | 602bd0e90e14c0b50246b361290dbbbe551ada98 (patch) | |
tree | bf8444fd9daa75c35c71a4dc118f7270c3f618f6 /net/socket.c | |
parent | fe3cce2e01ef7a2796c9674b1ec3a28a85f53547 (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.c | 24 |
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 | ||
1680 | out_put: | 1676 | out_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, |