summaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c78
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}
611EXPORT_SYMBOL(__sock_tx_timestamp); 611EXPORT_SYMBOL(__sock_tx_timestamp);
612 612
613static inline int __sock_sendmsg_nosec(struct kiocb *iocb, struct socket *sock, 613static 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
619static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, 619int 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
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;
639}
640
641int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
642{
643 return do_sock_sendmsg(sock, msg, size, false);
644} 624}
645EXPORT_SYMBOL(sock_sendmsg); 625EXPORT_SYMBOL(sock_sendmsg);
646 626
647static 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
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{
@@ -744,47 +719,21 @@ void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
744} 719}
745EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops); 720EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
746 721
747static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock, 722static 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
753static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, 728int 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
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} 734}
773EXPORT_SYMBOL(sock_recvmsg); 735EXPORT_SYMBOL(sock_recvmsg);
774 736
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/** 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}