aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/socket.h1
-rw-r--r--net/compat.c2
-rw-r--r--net/socket.c8
3 files changed, 9 insertions, 2 deletions
diff --git a/include/linux/socket.h b/include/linux/socket.h
index fab4d0ddf4ed..c9852ef7e317 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -51,6 +51,7 @@ struct msghdr {
51 void *msg_control; /* ancillary data */ 51 void *msg_control; /* ancillary data */
52 __kernel_size_t msg_controllen; /* ancillary data buffer length */ 52 __kernel_size_t msg_controllen; /* ancillary data buffer length */
53 unsigned int msg_flags; /* flags on received message */ 53 unsigned int msg_flags; /* flags on received message */
54 struct kiocb *msg_iocb; /* ptr to iocb for async requests */
54}; 55};
55 56
56struct user_msghdr { 57struct user_msghdr {
diff --git a/net/compat.c b/net/compat.c
index 13c0c9a25cd9..c4b6b0f43d5d 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -79,6 +79,8 @@ ssize_t get_compat_msghdr(struct msghdr *kmsg,
79 if (nr_segs > UIO_MAXIOV) 79 if (nr_segs > UIO_MAXIOV)
80 return -EMSGSIZE; 80 return -EMSGSIZE;
81 81
82 kmsg->msg_iocb = NULL;
83
82 err = compat_rw_copy_check_uvector(save_addr ? READ : WRITE, 84 err = compat_rw_copy_check_uvector(save_addr ? READ : WRITE,
83 compat_ptr(uiov), nr_segs, 85 compat_ptr(uiov), nr_segs,
84 UIO_FASTIOV, *iov, iov); 86 UIO_FASTIOV, *iov, iov);
diff --git a/net/socket.c b/net/socket.c
index 3e776776f42c..073809f4125f 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -798,7 +798,8 @@ static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to)
798{ 798{
799 struct file *file = iocb->ki_filp; 799 struct file *file = iocb->ki_filp;
800 struct socket *sock = file->private_data; 800 struct socket *sock = file->private_data;
801 struct msghdr msg = {.msg_iter = *to}; 801 struct msghdr msg = {.msg_iter = *to,
802 .msg_iocb = iocb};
802 ssize_t res; 803 ssize_t res;
803 804
804 if (file->f_flags & O_NONBLOCK) 805 if (file->f_flags & O_NONBLOCK)
@@ -819,7 +820,8 @@ static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from)
819{ 820{
820 struct file *file = iocb->ki_filp; 821 struct file *file = iocb->ki_filp;
821 struct socket *sock = file->private_data; 822 struct socket *sock = file->private_data;
822 struct msghdr msg = {.msg_iter = *from}; 823 struct msghdr msg = {.msg_iter = *from,
824 .msg_iocb = iocb};
823 ssize_t res; 825 ssize_t res;
824 826
825 if (iocb->ki_pos != 0) 827 if (iocb->ki_pos != 0)
@@ -1894,6 +1896,8 @@ static ssize_t copy_msghdr_from_user(struct msghdr *kmsg,
1894 if (nr_segs > UIO_MAXIOV) 1896 if (nr_segs > UIO_MAXIOV)
1895 return -EMSGSIZE; 1897 return -EMSGSIZE;
1896 1898
1899 kmsg->msg_iocb = NULL;
1900
1897 err = rw_copy_check_uvector(save_addr ? READ : WRITE, 1901 err = rw_copy_check_uvector(save_addr ? READ : WRITE,
1898 uiov, nr_segs, 1902 uiov, nr_segs,
1899 UIO_FASTIOV, *iov, iov); 1903 UIO_FASTIOV, *iov, iov);