aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c180
1 files changed, 53 insertions, 127 deletions
diff --git a/net/socket.c b/net/socket.c
index bbedbfcb42c2..884e32997698 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -140,8 +140,6 @@ static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
140static const struct file_operations socket_file_ops = { 140static const struct file_operations socket_file_ops = {
141 .owner = THIS_MODULE, 141 .owner = THIS_MODULE,
142 .llseek = no_llseek, 142 .llseek = no_llseek,
143 .read = new_sync_read,
144 .write = new_sync_write,
145 .read_iter = sock_read_iter, 143 .read_iter = sock_read_iter,
146 .write_iter = sock_write_iter, 144 .write_iter = sock_write_iter,
147 .poll = sock_poll, 145 .poll = sock_poll,
@@ -314,7 +312,7 @@ static const struct super_operations sockfs_ops = {
314static char *sockfs_dname(struct dentry *dentry, char *buffer, int buflen) 312static char *sockfs_dname(struct dentry *dentry, char *buffer, int buflen)
315{ 313{
316 return dynamic_dname(dentry, buffer, buflen, "socket:[%lu]", 314 return dynamic_dname(dentry, buffer, buflen, "socket:[%lu]",
317 dentry->d_inode->i_ino); 315 d_inode(dentry)->i_ino);
318} 316}
319 317
320static const struct dentry_operations sockfs_dentry_operations = { 318static const struct dentry_operations sockfs_dentry_operations = {
@@ -377,7 +375,7 @@ struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname)
377 &socket_file_ops); 375 &socket_file_ops);
378 if (unlikely(IS_ERR(file))) { 376 if (unlikely(IS_ERR(file))) {
379 /* drop dentry, keep inode */ 377 /* drop dentry, keep inode */
380 ihold(path.dentry->d_inode); 378 ihold(d_inode(path.dentry));
381 path_put(&path); 379 path_put(&path);
382 return file; 380 return file;
383 } 381 }
@@ -499,7 +497,7 @@ static ssize_t sockfs_listxattr(struct dentry *dentry, char *buffer,
499 ssize_t len; 497 ssize_t len;
500 ssize_t used = 0; 498 ssize_t used = 0;
501 499
502 len = security_inode_listsecurity(dentry->d_inode, buffer, size); 500 len = security_inode_listsecurity(d_inode(dentry), buffer, size);
503 if (len < 0) 501 if (len < 0)
504 return len; 502 return len;
505 used += len; 503 used += len;
@@ -610,60 +608,27 @@ void __sock_tx_timestamp(const struct sock *sk, __u8 *tx_flags)
610} 608}
611EXPORT_SYMBOL(__sock_tx_timestamp); 609EXPORT_SYMBOL(__sock_tx_timestamp);
612 610
613static inline int __sock_sendmsg_nosec(struct kiocb *iocb, struct socket *sock, 611static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg)
614 struct msghdr *msg, size_t size)
615{ 612{
616 return sock->ops->sendmsg(iocb, sock, msg, size); 613 int ret = sock->ops->sendmsg(sock, msg, msg_data_left(msg));
617} 614 BUG_ON(ret == -EIOCBQUEUED);
618
619static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock,
620 struct msghdr *msg, size_t size)
621{
622 int err = security_socket_sendmsg(sock, msg, size);
623
624 return err ?: __sock_sendmsg_nosec(iocb, sock, msg, size);
625}
626
627static int do_sock_sendmsg(struct socket *sock, struct msghdr *msg,
628 size_t size, bool nosec)
629{
630 struct kiocb iocb;
631 int ret;
632
633 init_sync_kiocb(&iocb, NULL);
634 ret = nosec ? __sock_sendmsg_nosec(&iocb, sock, msg, size) :
635 __sock_sendmsg(&iocb, sock, msg, size);
636 if (-EIOCBQUEUED == ret)
637 ret = wait_on_sync_kiocb(&iocb);
638 return ret; 615 return ret;
639} 616}
640 617
641int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) 618int sock_sendmsg(struct socket *sock, struct msghdr *msg)
642{ 619{
643 return do_sock_sendmsg(sock, msg, size, false); 620 int err = security_socket_sendmsg(sock, msg,
644} 621 msg_data_left(msg));
645EXPORT_SYMBOL(sock_sendmsg);
646 622
647static int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg, size_t size) 623 return err ?: sock_sendmsg_nosec(sock, msg);
648{
649 return do_sock_sendmsg(sock, msg, size, true);
650} 624}
625EXPORT_SYMBOL(sock_sendmsg);
651 626
652int kernel_sendmsg(struct socket *sock, struct msghdr *msg, 627int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
653 struct kvec *vec, size_t num, size_t size) 628 struct kvec *vec, size_t num, size_t size)
654{ 629{
655 mm_segment_t oldfs = get_fs(); 630 iov_iter_kvec(&msg->msg_iter, WRITE | ITER_KVEC, vec, num, size);
656 int result; 631 return sock_sendmsg(sock, msg);
657
658 set_fs(KERNEL_DS);
659 /*
660 * the following is safe, since for compiler definitions of kvec and
661 * iovec are identical, yielding the same in-core layout and alignment
662 */
663 iov_iter_init(&msg->msg_iter, WRITE, (struct iovec *)vec, num, size);
664 result = sock_sendmsg(sock, msg, size);
665 set_fs(oldfs);
666 return result;
667} 632}
668EXPORT_SYMBOL(kernel_sendmsg); 633EXPORT_SYMBOL(kernel_sendmsg);
669 634
@@ -731,9 +696,9 @@ EXPORT_SYMBOL_GPL(__sock_recv_wifi_status);
731static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, 696static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
732 struct sk_buff *skb) 697 struct sk_buff *skb)
733{ 698{
734 if (sock_flag(sk, SOCK_RXQ_OVFL) && skb && skb->dropcount) 699 if (sock_flag(sk, SOCK_RXQ_OVFL) && skb && SOCK_SKB_CB(skb)->dropcount)
735 put_cmsg(msg, SOL_SOCKET, SO_RXQ_OVFL, 700 put_cmsg(msg, SOL_SOCKET, SO_RXQ_OVFL,
736 sizeof(__u32), &skb->dropcount); 701 sizeof(__u32), &SOCK_SKB_CB(skb)->dropcount);
737} 702}
738 703
739void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk, 704void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
@@ -744,47 +709,21 @@ void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
744} 709}
745EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops); 710EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
746 711
747static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock, 712static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
748 struct msghdr *msg, size_t size, int flags) 713 size_t size, int flags)
749{ 714{
750 return sock->ops->recvmsg(iocb, sock, msg, size, flags); 715 return sock->ops->recvmsg(sock, msg, size, flags);
751} 716}
752 717
753static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, 718int sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
754 struct msghdr *msg, size_t size, int flags) 719 int flags)
755{ 720{
756 int err = security_socket_recvmsg(sock, msg, size, flags); 721 int err = security_socket_recvmsg(sock, msg, size, flags);
757 722
758 return err ?: __sock_recvmsg_nosec(iocb, sock, msg, size, flags); 723 return err ?: sock_recvmsg_nosec(sock, msg, size, flags);
759}
760
761int sock_recvmsg(struct socket *sock, struct msghdr *msg,
762 size_t size, int flags)
763{
764 struct kiocb iocb;
765 int ret;
766
767 init_sync_kiocb(&iocb, NULL);
768 ret = __sock_recvmsg(&iocb, sock, msg, size, flags);
769 if (-EIOCBQUEUED == ret)
770 ret = wait_on_sync_kiocb(&iocb);
771 return ret;
772} 724}
773EXPORT_SYMBOL(sock_recvmsg); 725EXPORT_SYMBOL(sock_recvmsg);
774 726
775static int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
776 size_t size, int flags)
777{
778 struct kiocb iocb;
779 int ret;
780
781 init_sync_kiocb(&iocb, NULL);
782 ret = __sock_recvmsg_nosec(&iocb, sock, msg, size, flags);
783 if (-EIOCBQUEUED == ret)
784 ret = wait_on_sync_kiocb(&iocb);
785 return ret;
786}
787
788/** 727/**
789 * kernel_recvmsg - Receive a message from a socket (kernel space) 728 * kernel_recvmsg - Receive a message from a socket (kernel space)
790 * @sock: The socket to receive the message from 729 * @sock: The socket to receive the message from
@@ -806,12 +745,8 @@ int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
806 mm_segment_t oldfs = get_fs(); 745 mm_segment_t oldfs = get_fs();
807 int result; 746 int result;
808 747
748 iov_iter_kvec(&msg->msg_iter, READ | ITER_KVEC, vec, num, size);
809 set_fs(KERNEL_DS); 749 set_fs(KERNEL_DS);
810 /*
811 * the following is safe, since for compiler definitions of kvec and
812 * iovec are identical, yielding the same in-core layout and alignment
813 */
814 iov_iter_init(&msg->msg_iter, READ, (struct iovec *)vec, num, size);
815 result = sock_recvmsg(sock, msg, size, flags); 750 result = sock_recvmsg(sock, msg, size, flags);
816 set_fs(oldfs); 751 set_fs(oldfs);
817 return result; 752 return result;
@@ -849,7 +784,8 @@ static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to)
849{ 784{
850 struct file *file = iocb->ki_filp; 785 struct file *file = iocb->ki_filp;
851 struct socket *sock = file->private_data; 786 struct socket *sock = file->private_data;
852 struct msghdr msg = {.msg_iter = *to}; 787 struct msghdr msg = {.msg_iter = *to,
788 .msg_iocb = iocb};
853 ssize_t res; 789 ssize_t res;
854 790
855 if (file->f_flags & O_NONBLOCK) 791 if (file->f_flags & O_NONBLOCK)
@@ -858,11 +794,10 @@ static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to)
858 if (iocb->ki_pos != 0) 794 if (iocb->ki_pos != 0)
859 return -ESPIPE; 795 return -ESPIPE;
860 796
861 if (iocb->ki_nbytes == 0) /* Match SYS5 behaviour */ 797 if (!iov_iter_count(to)) /* Match SYS5 behaviour */
862 return 0; 798 return 0;
863 799
864 res = __sock_recvmsg(iocb, sock, &msg, 800 res = sock_recvmsg(sock, &msg, iov_iter_count(to), msg.msg_flags);
865 iocb->ki_nbytes, msg.msg_flags);
866 *to = msg.msg_iter; 801 *to = msg.msg_iter;
867 return res; 802 return res;
868} 803}
@@ -871,7 +806,8 @@ static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from)
871{ 806{
872 struct file *file = iocb->ki_filp; 807 struct file *file = iocb->ki_filp;
873 struct socket *sock = file->private_data; 808 struct socket *sock = file->private_data;
874 struct msghdr msg = {.msg_iter = *from}; 809 struct msghdr msg = {.msg_iter = *from,
810 .msg_iocb = iocb};
875 ssize_t res; 811 ssize_t res;
876 812
877 if (iocb->ki_pos != 0) 813 if (iocb->ki_pos != 0)
@@ -883,7 +819,7 @@ static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from)
883 if (sock->type == SOCK_SEQPACKET) 819 if (sock->type == SOCK_SEQPACKET)
884 msg.msg_flags |= MSG_EOR; 820 msg.msg_flags |= MSG_EOR;
885 821
886 res = __sock_sendmsg(iocb, sock, &msg, iocb->ki_nbytes); 822 res = sock_sendmsg(sock, &msg);
887 *from = msg.msg_iter; 823 *from = msg.msg_iter;
888 return res; 824 return res;
889} 825}
@@ -1700,16 +1636,14 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
1700 struct iovec iov; 1636 struct iovec iov;
1701 int fput_needed; 1637 int fput_needed;
1702 1638
1703 if (len > INT_MAX) 1639 err = import_single_range(WRITE, buff, len, &iov, &msg.msg_iter);
1704 len = INT_MAX; 1640 if (unlikely(err))
1641 return err;
1705 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1642 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1706 if (!sock) 1643 if (!sock)
1707 goto out; 1644 goto out;
1708 1645
1709 iov.iov_base = buff;
1710 iov.iov_len = len;
1711 msg.msg_name = NULL; 1646 msg.msg_name = NULL;
1712 iov_iter_init(&msg.msg_iter, WRITE, &iov, 1, len);
1713 msg.msg_control = NULL; 1647 msg.msg_control = NULL;
1714 msg.msg_controllen = 0; 1648 msg.msg_controllen = 0;
1715 msg.msg_namelen = 0; 1649 msg.msg_namelen = 0;
@@ -1723,7 +1657,7 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
1723 if (sock->file->f_flags & O_NONBLOCK) 1657 if (sock->file->f_flags & O_NONBLOCK)
1724 flags |= MSG_DONTWAIT; 1658 flags |= MSG_DONTWAIT;
1725 msg.msg_flags = flags; 1659 msg.msg_flags = flags;
1726 err = sock_sendmsg(sock, &msg, len); 1660 err = sock_sendmsg(sock, &msg);
1727 1661
1728out_put: 1662out_put:
1729 fput_light(sock->file, fput_needed); 1663 fput_light(sock->file, fput_needed);
@@ -1758,24 +1692,22 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
1758 int err, err2; 1692 int err, err2;
1759 int fput_needed; 1693 int fput_needed;
1760 1694
1761 if (size > INT_MAX) 1695 err = import_single_range(READ, ubuf, size, &iov, &msg.msg_iter);
1762 size = INT_MAX; 1696 if (unlikely(err))
1697 return err;
1763 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1698 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1764 if (!sock) 1699 if (!sock)
1765 goto out; 1700 goto out;
1766 1701
1767 msg.msg_control = NULL; 1702 msg.msg_control = NULL;
1768 msg.msg_controllen = 0; 1703 msg.msg_controllen = 0;
1769 iov.iov_len = size;
1770 iov.iov_base = ubuf;
1771 iov_iter_init(&msg.msg_iter, READ, &iov, 1, size);
1772 /* Save some cycles and don't copy the address if not needed */ 1704 /* Save some cycles and don't copy the address if not needed */
1773 msg.msg_name = addr ? (struct sockaddr *)&address : NULL; 1705 msg.msg_name = addr ? (struct sockaddr *)&address : NULL;
1774 /* We assume all kernel code knows the size of sockaddr_storage */ 1706 /* We assume all kernel code knows the size of sockaddr_storage */
1775 msg.msg_namelen = 0; 1707 msg.msg_namelen = 0;
1776 if (sock->file->f_flags & O_NONBLOCK) 1708 if (sock->file->f_flags & O_NONBLOCK)
1777 flags |= MSG_DONTWAIT; 1709 flags |= MSG_DONTWAIT;
1778 err = sock_recvmsg(sock, &msg, size, flags); 1710 err = sock_recvmsg(sock, &msg, iov_iter_count(&msg.msg_iter), flags);
1779 1711
1780 if (err >= 0 && addr != NULL) { 1712 if (err >= 0 && addr != NULL) {
1781 err2 = move_addr_to_user(&address, 1713 err2 = move_addr_to_user(&address,
@@ -1895,10 +1827,10 @@ struct used_address {
1895 unsigned int name_len; 1827 unsigned int name_len;
1896}; 1828};
1897 1829
1898static ssize_t copy_msghdr_from_user(struct msghdr *kmsg, 1830static int copy_msghdr_from_user(struct msghdr *kmsg,
1899 struct user_msghdr __user *umsg, 1831 struct user_msghdr __user *umsg,
1900 struct sockaddr __user **save_addr, 1832 struct sockaddr __user **save_addr,
1901 struct iovec **iov) 1833 struct iovec **iov)
1902{ 1834{
1903 struct sockaddr __user *uaddr; 1835 struct sockaddr __user *uaddr;
1904 struct iovec __user *uiov; 1836 struct iovec __user *uiov;
@@ -1942,13 +1874,10 @@ static ssize_t copy_msghdr_from_user(struct msghdr *kmsg,
1942 if (nr_segs > UIO_MAXIOV) 1874 if (nr_segs > UIO_MAXIOV)
1943 return -EMSGSIZE; 1875 return -EMSGSIZE;
1944 1876
1945 err = rw_copy_check_uvector(save_addr ? READ : WRITE, 1877 kmsg->msg_iocb = NULL;
1946 uiov, nr_segs, 1878
1947 UIO_FASTIOV, *iov, iov); 1879 return import_iovec(save_addr ? READ : WRITE, uiov, nr_segs,
1948 if (err >= 0) 1880 UIO_FASTIOV, iov, &kmsg->msg_iter);
1949 iov_iter_init(&kmsg->msg_iter, save_addr ? READ : WRITE,
1950 *iov, nr_segs, err);
1951 return err;
1952} 1881}
1953 1882
1954static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg, 1883static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg,
@@ -1963,7 +1892,7 @@ static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg,
1963 __attribute__ ((aligned(sizeof(__kernel_size_t)))); 1892 __attribute__ ((aligned(sizeof(__kernel_size_t))));
1964 /* 20 is size of ipv6_pktinfo */ 1893 /* 20 is size of ipv6_pktinfo */
1965 unsigned char *ctl_buf = ctl; 1894 unsigned char *ctl_buf = ctl;
1966 int ctl_len, total_len; 1895 int ctl_len;
1967 ssize_t err; 1896 ssize_t err;
1968 1897
1969 msg_sys->msg_name = &address; 1898 msg_sys->msg_name = &address;
@@ -1973,8 +1902,7 @@ static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg,
1973 else 1902 else
1974 err = copy_msghdr_from_user(msg_sys, msg, NULL, &iov); 1903 err = copy_msghdr_from_user(msg_sys, msg, NULL, &iov);
1975 if (err < 0) 1904 if (err < 0)
1976 goto out_freeiov; 1905 return err;
1977 total_len = err;
1978 1906
1979 err = -ENOBUFS; 1907 err = -ENOBUFS;
1980 1908
@@ -2021,10 +1949,10 @@ static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg,
2021 used_address->name_len == msg_sys->msg_namelen && 1949 used_address->name_len == msg_sys->msg_namelen &&
2022 !memcmp(&used_address->name, msg_sys->msg_name, 1950 !memcmp(&used_address->name, msg_sys->msg_name,
2023 used_address->name_len)) { 1951 used_address->name_len)) {
2024 err = sock_sendmsg_nosec(sock, msg_sys, total_len); 1952 err = sock_sendmsg_nosec(sock, msg_sys);
2025 goto out_freectl; 1953 goto out_freectl;
2026 } 1954 }
2027 err = sock_sendmsg(sock, msg_sys, total_len); 1955 err = sock_sendmsg(sock, msg_sys);
2028 /* 1956 /*
2029 * If this is sendmmsg() and sending to current destination address was 1957 * If this is sendmmsg() and sending to current destination address was
2030 * successful, remember it. 1958 * successful, remember it.
@@ -2040,8 +1968,7 @@ out_freectl:
2040 if (ctl_buf != ctl) 1968 if (ctl_buf != ctl)
2041 sock_kfree_s(sock->sk, ctl_buf, ctl_len); 1969 sock_kfree_s(sock->sk, ctl_buf, ctl_len);
2042out_freeiov: 1970out_freeiov:
2043 if (iov != iovstack) 1971 kfree(iov);
2044 kfree(iov);
2045 return err; 1972 return err;
2046} 1973}
2047 1974
@@ -2166,8 +2093,8 @@ static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg,
2166 else 2093 else
2167 err = copy_msghdr_from_user(msg_sys, msg, &uaddr, &iov); 2094 err = copy_msghdr_from_user(msg_sys, msg, &uaddr, &iov);
2168 if (err < 0) 2095 if (err < 0)
2169 goto out_freeiov; 2096 return err;
2170 total_len = err; 2097 total_len = iov_iter_count(&msg_sys->msg_iter);
2171 2098
2172 cmsg_ptr = (unsigned long)msg_sys->msg_control; 2099 cmsg_ptr = (unsigned long)msg_sys->msg_control;
2173 msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT); 2100 msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT);
@@ -2205,8 +2132,7 @@ static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg,
2205 err = len; 2132 err = len;
2206 2133
2207out_freeiov: 2134out_freeiov:
2208 if (iov != iovstack) 2135 kfree(iov);
2209 kfree(iov);
2210 return err; 2136 return err;
2211} 2137}
2212 2138