diff options
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 78 |
1 files changed, 13 insertions, 65 deletions
diff --git a/net/socket.c b/net/socket.c index b78cf601a021..95d3085cb477 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -610,45 +610,20 @@ void __sock_tx_timestamp(const struct sock *sk, __u8 *tx_flags) | |||
610 | } | 610 | } |
611 | EXPORT_SYMBOL(__sock_tx_timestamp); | 611 | EXPORT_SYMBOL(__sock_tx_timestamp); |
612 | 612 | ||
613 | static inline int __sock_sendmsg_nosec(struct kiocb *iocb, struct socket *sock, | 613 | static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg, |
614 | struct msghdr *msg, size_t size) | 614 | size_t size) |
615 | { | 615 | { |
616 | return sock->ops->sendmsg(iocb, sock, msg, size); | 616 | return sock->ops->sendmsg(sock, msg, size); |
617 | } | 617 | } |
618 | 618 | ||
619 | static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, | 619 | int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) |
620 | struct msghdr *msg, size_t size) | ||
621 | { | 620 | { |
622 | int err = security_socket_sendmsg(sock, msg, size); | 621 | int err = security_socket_sendmsg(sock, msg, size); |
623 | 622 | ||
624 | return err ?: __sock_sendmsg_nosec(iocb, sock, msg, size); | 623 | return err ?: sock_sendmsg_nosec(sock, msg, size); |
625 | } | ||
626 | |||
627 | static 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; | ||
639 | } | ||
640 | |||
641 | int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) | ||
642 | { | ||
643 | return do_sock_sendmsg(sock, msg, size, false); | ||
644 | } | 624 | } |
645 | EXPORT_SYMBOL(sock_sendmsg); | 625 | EXPORT_SYMBOL(sock_sendmsg); |
646 | 626 | ||
647 | static int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg, size_t size) | ||
648 | { | ||
649 | return do_sock_sendmsg(sock, msg, size, true); | ||
650 | } | ||
651 | |||
652 | int kernel_sendmsg(struct socket *sock, struct msghdr *msg, | 627 | int 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 | { |
@@ -744,47 +719,21 @@ void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk, | |||
744 | } | 719 | } |
745 | EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops); | 720 | EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops); |
746 | 721 | ||
747 | static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock, | 722 | static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg, |
748 | struct msghdr *msg, size_t size, int flags) | 723 | size_t size, int flags) |
749 | { | 724 | { |
750 | return sock->ops->recvmsg(iocb, sock, msg, size, flags); | 725 | return sock->ops->recvmsg(sock, msg, size, flags); |
751 | } | 726 | } |
752 | 727 | ||
753 | static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, | 728 | int sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, |
754 | struct msghdr *msg, size_t size, int flags) | 729 | int flags) |
755 | { | 730 | { |
756 | int err = security_socket_recvmsg(sock, msg, size, flags); | 731 | int err = security_socket_recvmsg(sock, msg, size, flags); |
757 | 732 | ||
758 | return err ?: __sock_recvmsg_nosec(iocb, sock, msg, size, flags); | 733 | return err ?: sock_recvmsg_nosec(sock, msg, size, flags); |
759 | } | ||
760 | |||
761 | int 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 | } | 734 | } |
773 | EXPORT_SYMBOL(sock_recvmsg); | 735 | EXPORT_SYMBOL(sock_recvmsg); |
774 | 736 | ||
775 | static 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 | /** | 737 | /** |
789 | * kernel_recvmsg - Receive a message from a socket (kernel space) | 738 | * kernel_recvmsg - Receive a message from a socket (kernel space) |
790 | * @sock: The socket to receive the message from | 739 | * @sock: The socket to receive the message from |
@@ -861,8 +810,7 @@ static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to) | |||
861 | if (iocb->ki_nbytes == 0) /* Match SYS5 behaviour */ | 810 | if (iocb->ki_nbytes == 0) /* Match SYS5 behaviour */ |
862 | return 0; | 811 | return 0; |
863 | 812 | ||
864 | res = __sock_recvmsg(iocb, sock, &msg, | 813 | res = sock_recvmsg(sock, &msg, iocb->ki_nbytes, msg.msg_flags); |
865 | iocb->ki_nbytes, msg.msg_flags); | ||
866 | *to = msg.msg_iter; | 814 | *to = msg.msg_iter; |
867 | return res; | 815 | return res; |
868 | } | 816 | } |
@@ -883,7 +831,7 @@ static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
883 | if (sock->type == SOCK_SEQPACKET) | 831 | if (sock->type == SOCK_SEQPACKET) |
884 | msg.msg_flags |= MSG_EOR; | 832 | msg.msg_flags |= MSG_EOR; |
885 | 833 | ||
886 | res = __sock_sendmsg(iocb, sock, &msg, iocb->ki_nbytes); | 834 | res = sock_sendmsg(sock, &msg, iocb->ki_nbytes); |
887 | *from = msg.msg_iter; | 835 | *from = msg.msg_iter; |
888 | return res; | 836 | return res; |
889 | } | 837 | } |