Module: xenomai-3
Branch: wip/rtnet-fixes
Commit: 8adbd0f5293ada2b57e2e50a40b5f5d1cab47fa2
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8adbd0f5293ada2b57e2e50a40b5f5d1cab47fa2

Author: Philippe Gerum <r...@xenomai.org>
Date:   Wed Dec  6 13:17:20 2017 +0100

net/tcp: {recv|send}msg: remove direct references to user memory

---

 kernel/drivers/net/stack/ipv4/tcp/tcp.c |   86 ++++++++++++++++++++++++-------
 1 file changed, 66 insertions(+), 20 deletions(-)

diff --git a/kernel/drivers/net/stack/ipv4/tcp/tcp.c 
b/kernel/drivers/net/stack/ipv4/tcp/tcp.c
index f01399d..c5e42bc 100644
--- a/kernel/drivers/net/stack/ipv4/tcp/tcp.c
+++ b/kernel/drivers/net/stack/ipv4/tcp/tcp.c
@@ -2069,20 +2069,43 @@ static ssize_t rt_tcp_write(struct rtdm_fd *fd, const 
void *buf, size_t nbyte)
  */
 static ssize_t rt_tcp_recvmsg(struct rtdm_fd *fd, struct user_msghdr *msg, int 
msg_flags)
 {
-    size_t len;
-    void *buf;
+       struct iovec iov_fast[RTDM_IOV_FASTMAX], *iov;
+       struct user_msghdr _msg;
+       ssize_t ret;
+       size_t len;
+       void *buf;
 
-    if (msg_flags)
-       return -EOPNOTSUPP;
+       if (msg_flags)
+               return -EOPNOTSUPP;
 
-    /* loop over all vectors to be implemented */
-    if (msg->msg_iovlen != 1)
-       return -EOPNOTSUPP;
+       msg = rtnet_get_arg(fd, &_msg, msg, sizeof(*msg));
+       if (IS_ERR(msg))
+               return PTR_ERR(msg);
 
-    len = msg->msg_iov[0].iov_len;
-    buf = msg->msg_iov[0].iov_base;
+       /* loop over all vectors to be implemented */
+       if (msg->msg_iovlen != 1)
+               return -EOPNOTSUPP;
 
-    return rt_tcp_read(fd, buf, len);
+       ret = rtdm_get_iovec(fd, &iov, msg, iov_fast);
+       if (ret)
+               return ret;
+
+       len = iov[0].iov_len;
+       if (len > 0) {
+               buf = xnmalloc(len);
+               if (buf == NULL) {
+                       ret = -ENOMEM;
+                       goto out;
+               }
+               ret = rtdm_copy_from_user(fd, buf, iov[0].iov_base, len);
+               if (!ret)
+                       ret = rt_tcp_read(fd, buf, len);
+               xnfree(buf);
+       }
+out:
+       rtdm_drop_iovec(iov, iov_fast);
+
+       return ret;
 }
 
 /***
@@ -2091,20 +2114,43 @@ static ssize_t rt_tcp_recvmsg(struct rtdm_fd *fd, 
struct user_msghdr *msg, int m
 static ssize_t rt_tcp_sendmsg(struct rtdm_fd *fd,
                              const struct user_msghdr *msg, int msg_flags)
 {
-    size_t len;
-    void *buf;
+       struct iovec iov_fast[RTDM_IOV_FASTMAX], *iov;
+       struct user_msghdr _msg;
+       ssize_t ret;
+       size_t len;
+       void *buf;
 
-    if (msg_flags)
-       return -EOPNOTSUPP;
+       if (msg_flags)
+               return -EOPNOTSUPP;
 
-    /* loop over all vectors to be implemented */
-    if (msg->msg_iovlen != 1)
-       return -EOPNOTSUPP;
+       msg = rtnet_get_arg(fd, &_msg, msg, sizeof(*msg));
+       if (IS_ERR(msg))
+               return PTR_ERR(msg);
 
-    len = msg->msg_iov[0].iov_len;
-    buf = msg->msg_iov[0].iov_base;
+       /* loop over all vectors to be implemented */
+       if (msg->msg_iovlen != 1)
+               return -EOPNOTSUPP;
 
-    return rt_tcp_write(fd, (const void*)buf, len);
+       ret = rtdm_get_iovec(fd, &iov, msg, iov_fast);
+       if (ret)
+               return ret;
+
+       len = iov[0].iov_len;
+       if (len > 0) {
+               buf = xnmalloc(len);
+               if (buf == NULL) {
+                       ret = -ENOMEM;
+                       goto out;
+               }
+               ret = rtdm_copy_from_user(fd, buf, iov[0].iov_base, len);
+               if (!ret)
+                       ret = rt_tcp_write(fd, buf, len);
+               xnfree(buf);
+       }
+out:
+       rtdm_drop_iovec(iov, iov_fast);
+
+       return ret;
 }
 
 /***


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to