summaryrefslogtreecommitdiff
path: root/sys/compat/linux
diff options
context:
space:
mode:
authormaxv <maxv@NetBSD.org>2019-08-24 12:33:25 +0000
committermaxv <maxv@NetBSD.org>2019-08-24 12:33:25 +0000
commitb7fa3afd42a567bc28b2a2c71b60d606531b94b1 (patch)
tree7046d48b24cb1472fc11b610199a1e811c967d08 /sys/compat/linux
parent2c67a10838eaf14b8e11f42091acb0fc364edd06 (diff)
Don't read data from userland directly. This simply does not work on any
recent x86 CPU (thanks to SMAP) and all architectures that forbid direct access to userland from the kernel. But I guess no one noticed because no one ever uses compat_linux, right?
Diffstat (limited to 'sys/compat/linux')
-rw-r--r--sys/compat/linux/common/linux_socket.c6
-rw-r--r--sys/compat/linux/common/linux_socket.h12
2 files changed, 9 insertions, 9 deletions
diff --git a/sys/compat/linux/common/linux_socket.c b/sys/compat/linux/common/linux_socket.c
index 12dee086271..a3b248e375f 100644
--- a/sys/compat/linux/common/linux_socket.c
+++ b/sys/compat/linux/common/linux_socket.c
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_socket.c,v 1.145 2019/04/18 17:45:12 christos Exp $ */
+/* $NetBSD: linux_socket.c,v 1.146 2019/08/24 12:33:25 maxv Exp $ */
/*-
* Copyright (c) 1995, 1998, 2008 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_socket.c,v 1.145 2019/04/18 17:45:12 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_socket.c,v 1.146 2019/08/24 12:33:25 maxv Exp $");
#if defined(_KERNEL_OPT)
#include "opt_inet.h"
@@ -605,7 +605,7 @@ linux_sys_sendmsg(struct lwp *l, const struct linux_sys_sendmsg_args *uap, regis
resid -= LINUX_CMSG_ALIGN(l_cmsg.cmsg_len);
cidx += cspace;
- } while ((l_cc = LINUX_CMSG_NXTHDR(&msg, l_cc)) && resid > 0);
+ } while ((l_cc = LINUX_CMSG_NXTHDR(&msg, l_cc, &l_cmsg)) && resid > 0);
/* If we allocated a buffer, attach to mbuf */
if (cidx > MLEN) {
diff --git a/sys/compat/linux/common/linux_socket.h b/sys/compat/linux/common/linux_socket.h
index 3b14fd15ef5..336c9c288cc 100644
--- a/sys/compat/linux/common/linux_socket.h
+++ b/sys/compat/linux/common/linux_socket.h
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_socket.h,v 1.23 2017/02/03 16:57:39 christos Exp $ */
+/* $NetBSD: linux_socket.h,v 1.24 2019/08/24 12:33:25 maxv Exp $ */
/*-
* Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
@@ -186,13 +186,13 @@ struct linux_cmsghdr {
/* Linux either uses this, or &((cmsg)->__cmsg_data) */
#define LINUX_CMSG_DATA(cmsg) \
((u_char *)((struct linux_cmsghdr *)(cmsg) + 1))
-#define LINUX_CMSG_NXTHDR(mhdr, cmsg) \
- ((((char *)(cmsg) + LINUX_CMSG_ALIGN((cmsg)->cmsg_len) + \
- sizeof(*(cmsg))) > \
+#define LINUX_CMSG_NXTHDR(mhdr, ucmsg, kcmsg) \
+ ((((char *)(ucmsg) + LINUX_CMSG_ALIGN((kcmsg)->cmsg_len) + \
+ sizeof(*(ucmsg))) > \
(((char *)(mhdr)->msg_control) + (mhdr)->msg_controllen)) ? \
(struct linux_cmsghdr *)NULL : \
- (struct linux_cmsghdr *)((char *)(cmsg) + \
- LINUX_CMSG_ALIGN((cmsg)->cmsg_len)))
+ (struct linux_cmsghdr *)((char *)(ucmsg) + \
+ LINUX_CMSG_ALIGN((kcmsg)->cmsg_len)))
/* This the number of bytes removed from each item (excl. final padding) */
#define LINUX_CMSG_ALIGN_DELTA \
(CMSG_ALIGN(sizeof(struct cmsghdr)) - sizeof(struct linux_cmsghdr))