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

Author: Philippe Gerum <r...@xenomai.org>
Date:   Mon Dec  4 19:40:34 2017 +0100

net/packet: ioctl: remove direct references to user memory

---

 kernel/drivers/net/stack/packet/af_packet.c |   36 ++++++++++++++++-----------
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/kernel/drivers/net/stack/packet/af_packet.c 
b/kernel/drivers/net/stack/packet/af_packet.c
index 1e4c2be..f6638a7 100644
--- a/kernel/drivers/net/stack/packet/af_packet.c
+++ b/kernel/drivers/net/stack/packet/af_packet.c
@@ -24,6 +24,7 @@
 
 #include <linux/module.h>
 #include <linux/sched.h>
+#include <linux/err.h>
 
 #include <rtnet_iovec.h>
 #include <rtnet_socket.h>
@@ -251,28 +252,35 @@ static void rt_packet_close(struct rtdm_fd *fd)
 /***
  *  rt_packet_ioctl
  */
-static int rt_packet_ioctl(struct rtdm_fd *fd, unsigned int request, void *arg)
+static int rt_packet_ioctl(struct rtdm_fd *fd, unsigned int request, void 
__user *arg)
 {
-    struct rtsocket *sock = rtdm_fd_to_private(fd);
-    struct _rtdm_setsockaddr_args *setaddr = arg;
-    struct _rtdm_getsockaddr_args *getaddr = arg;
-
+       struct rtsocket *sock = rtdm_fd_to_private(fd);
+       const struct _rtdm_setsockaddr_args *setaddr;
+       struct _rtdm_setsockaddr_args _setaddr;
+       const struct _rtdm_getsockaddr_args *getaddr;
+       struct _rtdm_getsockaddr_args _getaddr;
 
-    /* fast path for common socket IOCTLs */
-    if (_IOC_TYPE(request) == RTIOC_TYPE_NETWORK)
-       return rt_socket_common_ioctl(fd, request, arg);
+       /* fast path for common socket IOCTLs */
+       if (_IOC_TYPE(request) == RTIOC_TYPE_NETWORK)
+               return rt_socket_common_ioctl(fd, request, arg);
 
-    switch (request) {
+       switch (request) {
        case _RTIOC_BIND:
-           return rt_packet_bind(sock, setaddr->addr, setaddr->addrlen);
+               setaddr = rtnet_get_arg(fd, &_setaddr, arg, sizeof(_setaddr));
+               if (IS_ERR(setaddr))
+                       return PTR_ERR(setaddr);
+               return rt_packet_bind(sock, setaddr->addr, setaddr->addrlen);
 
        case _RTIOC_GETSOCKNAME:
-           return rt_packet_getsockname(sock, getaddr->addr,
-                                        getaddr->addrlen);
+               getaddr = rtnet_get_arg(fd, &_getaddr, arg, sizeof(_getaddr));
+               if (IS_ERR(getaddr))
+                       return PTR_ERR(getaddr);
+               return rt_packet_getsockname(sock, getaddr->addr,
+                                            getaddr->addrlen);
 
        default:
-           return rt_socket_if_ioctl(fd, request, arg);
-    }
+               return rt_socket_if_ioctl(fd, request, arg);
+       }
 }
 
 


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

Reply via email to