Module: xenomai-3 Branch: next Commit: eccda56df5440d4e0a30d6aeda3f83313e8ba713 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=eccda56df5440d4e0a30d6aeda3f83313e8ba713
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