Module Name: src Committed By: martin Date: Fri Sep 13 06:25:26 UTC 2019
Modified Files: src/sys/compat/linux/arch/amd64 [netbsd-9]: linux_machdep.c src/sys/compat/linux/common [netbsd-9]: linux_fcntl.h linux_file64.c linux_ipc.c linux_misc.c linux_signal.c linux_socket.c linux_socket.h linux_statfs.h linux_termios.c linux_termios.h src/sys/compat/linux32/common [netbsd-9]: linux32_dirent.c linux32_ioctl.c linux32_misc.c linux32_signal.c linux32_sysinfo.c linux32_termios.c linux32_utsname.c src/sys/compat/netbsd32 [netbsd-9]: netbsd32_compat_43.c src/sys/compat/ossaudio [netbsd-9]: ossaudio.c src/sys/kern [netbsd-9]: sysv_shm.c src/sys/miscfs/procfs [netbsd-9]: procfs_linux.c src/sys/sys [netbsd-9]: shm.h Log Message: Pull up following revision(s) (requested by maxv in ticket #194): sys/compat/linux/common/linux_socket.c: revision 1.146 sys/compat/linux/common/linux_socket.c: revision 1.147 sys/compat/linux/common/linux_socket.c: revision 1.148 sys/compat/linux/common/linux_socket.c: revision 1.149 sys/compat/linux/arch/amd64/linux_machdep.c: revision 1.59 sys/compat/linux32/common/linux32_sysinfo.c: revision 1.8 sys/kern/sysv_shm.c: revision 1.138 sys/compat/linux/common/linux_file64.c: revision 1.61 sys/compat/linux/common/linux_file64.c: revision 1.62 sys/compat/netbsd32/netbsd32_compat_43.c: revision 1.58 sys/compat/linux32/common/linux32_dirent.c: revision 1.20 sys/compat/linux32/common/linux32_utsname.c: revision 1.10 sys/compat/linux/common/linux_termios.h: revision 1.22 sys/compat/linux32/common/linux32_termios.c: revision 1.15 sys/compat/linux32/common/linux32_misc.c: revision 1.27 sys/compat/linux32/common/linux32_ioctl.c: revision 1.14 sys/compat/linux/common/linux_statfs.h: revision 1.7 sys/compat/linux/common/linux_ipc.c: revision 1.57 sys/compat/linux/common/linux_fcntl.h: revision 1.18 sys/compat/linux/common/linux_socket.h: revision 1.24 sys/sys/shm.h: revision 1.54 sys/compat/ossaudio/ossaudio.c: revision 1.75 sys/compat/linux32/common/linux32_signal.c: revision 1.20 sys/miscfs/procfs/procfs_linux.c: revision 1.75 sys/compat/linux/common/linux_signal.c: revision 1.81 sys/compat/linux/common/linux_termios.c: revision 1.38 sys/compat/linux/common/linux_misc.c: revision 1.241 sys/compat/linux/common/linux_misc.c: revision 1.242 sys/compat/linux/common/linux_misc.c: revision 1.243 sys/compat/linux/common/linux_misc.c: revision 1.244 Fix info leaks. Fix stupid bugs in linux_sys_shmctl(): the index could be out of bound (page fault) and there was no proper locking. Maybe we should just remove LINUX_SHM_STAT, like compat_linux32. Remove printf. When dealing with an unknown value, set -1, to prevent (harmless) uninitialized accesses later. Add a default case, don't call sys_ioctl() with an uninitialized 'com' argument. Fix error handling, returns an errno, not -1. Put the printf under DEBUG_LINUX. Hum, don't forget the 'pid' argument, otherwise we're not gonna go very far. 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? Hum, don't pass an mbuf to realloc(). Inspired from copyin32_msg_control(). Fix memory leak. I don't see the point in having this useless printf, but add a '\n' to it, so that it at least displays useless stuff correctly. Hum, remove incorrect assignment. Userland could have passed a smaller namelen, and the uninitialized bytes from sb_data were being used later in the network stack. To generate a diff of this commit: cvs rdiff -u -r1.58 -r1.58.2.1 \ src/sys/compat/linux/arch/amd64/linux_machdep.c cvs rdiff -u -r1.17 -r1.17.22.1 src/sys/compat/linux/common/linux_fcntl.h cvs rdiff -u -r1.60 -r1.60.4.1 src/sys/compat/linux/common/linux_file64.c cvs rdiff -u -r1.56 -r1.56.4.1 src/sys/compat/linux/common/linux_ipc.c cvs rdiff -u -r1.240 -r1.240.4.1 src/sys/compat/linux/common/linux_misc.c cvs rdiff -u -r1.80 -r1.80.8.1 src/sys/compat/linux/common/linux_signal.c cvs rdiff -u -r1.145 -r1.145.4.1 src/sys/compat/linux/common/linux_socket.c cvs rdiff -u -r1.23 -r1.23.18.1 src/sys/compat/linux/common/linux_socket.h cvs rdiff -u -r1.6 -r1.6.42.1 src/sys/compat/linux/common/linux_statfs.h cvs rdiff -u -r1.37 -r1.37.34.1 src/sys/compat/linux/common/linux_termios.c cvs rdiff -u -r1.21 -r1.21.58.1 src/sys/compat/linux/common/linux_termios.h cvs rdiff -u -r1.19 -r1.19.4.1 src/sys/compat/linux32/common/linux32_dirent.c cvs rdiff -u -r1.13 -r1.13.68.1 src/sys/compat/linux32/common/linux32_ioctl.c cvs rdiff -u -r1.26 -r1.26.18.1 src/sys/compat/linux32/common/linux32_misc.c cvs rdiff -u -r1.19 -r1.19.8.1 src/sys/compat/linux32/common/linux32_signal.c cvs rdiff -u -r1.7 -r1.7.72.1 src/sys/compat/linux32/common/linux32_sysinfo.c cvs rdiff -u -r1.14 -r1.14.72.1 \ src/sys/compat/linux32/common/linux32_termios.c cvs rdiff -u -r1.9 -r1.9.72.1 src/sys/compat/linux32/common/linux32_utsname.c cvs rdiff -u -r1.57 -r1.57.4.1 src/sys/compat/netbsd32/netbsd32_compat_43.c cvs rdiff -u -r1.74 -r1.74.4.1 src/sys/compat/ossaudio/ossaudio.c cvs rdiff -u -r1.135.2.1 -r1.135.2.2 src/sys/kern/sysv_shm.c cvs rdiff -u -r1.74.4.1 -r1.74.4.2 src/sys/miscfs/procfs/procfs_linux.c cvs rdiff -u -r1.52 -r1.52.4.1 src/sys/sys/shm.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/linux/arch/amd64/linux_machdep.c diff -u src/sys/compat/linux/arch/amd64/linux_machdep.c:1.58 src/sys/compat/linux/arch/amd64/linux_machdep.c:1.58.2.1 --- src/sys/compat/linux/arch/amd64/linux_machdep.c:1.58 Sun May 19 08:46:15 2019 +++ src/sys/compat/linux/arch/amd64/linux_machdep.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_machdep.c,v 1.58 2019/05/19 08:46:15 maxv Exp $ */ +/* $NetBSD: linux_machdep.c,v 1.58.2.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 2005 Emmanuel Dreyfus, all rights reserved. @@ -33,7 +33,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.58 2019/05/19 08:46:15 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.58.2.1 2019/09/13 06:25:25 martin Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -263,7 +263,6 @@ linux_sendsig(const ksiginfo_t *ksi, con int linux_sys_modify_ldt(struct lwp *l, const struct linux_sys_modify_ldt_args *v, register_t *retval) { - printf("linux_sys_modify_ldt\n"); return 0; } Index: src/sys/compat/linux/common/linux_fcntl.h diff -u src/sys/compat/linux/common/linux_fcntl.h:1.17 src/sys/compat/linux/common/linux_fcntl.h:1.17.22.1 --- src/sys/compat/linux/common/linux_fcntl.h:1.17 Sun Mar 1 13:19:39 2015 +++ src/sys/compat/linux/common/linux_fcntl.h Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_fcntl.h,v 1.17 2015/03/01 13:19:39 njoly Exp $ */ +/* $NetBSD: linux_fcntl.h,v 1.17.22.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. @@ -132,6 +132,9 @@ LINUX##_to_bsd_##FLOCK(struct flock *bfp case src_f##_WRLCK: \ dst->l_type = dst_f##_WRLCK; \ break; \ + default: \ + dst->l_type = -1; \ + break; \ } \ } Index: src/sys/compat/linux/common/linux_file64.c diff -u src/sys/compat/linux/common/linux_file64.c:1.60 src/sys/compat/linux/common/linux_file64.c:1.60.4.1 --- src/sys/compat/linux/common/linux_file64.c:1.60 Mon Sep 3 16:29:29 2018 +++ src/sys/compat/linux/common/linux_file64.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_file64.c,v 1.60 2018/09/03 16:29:29 riastradh Exp $ */ +/* $NetBSD: linux_file64.c,v 1.60.4.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 1995, 1998, 2000, 2008 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_file64.c,v 1.60 2018/09/03 16:29:29 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_file64.c,v 1.60.4.1 2019/09/13 06:25:25 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -80,6 +80,7 @@ static void bsd_to_linux_stat(struct sta static void bsd_to_linux_stat(struct stat *bsp, struct linux_stat64 *lsp) { + memset(lsp, 0, sizeof(*lsp)); lsp->lst_dev = linux_fakedev(bsp->st_dev, 0); lsp->lst_ino = bsp->st_ino; lsp->lst_mode = (linux_mode_t)bsp->st_mode; @@ -352,6 +353,7 @@ again: * we have to worry about touching user memory outside of * the copyout() call). */ + memset(&idb, 0, sizeof(idb)); idb.d_ino = bdp->d_fileno; idb.d_type = bdp->d_type; idb.d_off = off; Index: src/sys/compat/linux/common/linux_ipc.c diff -u src/sys/compat/linux/common/linux_ipc.c:1.56 src/sys/compat/linux/common/linux_ipc.c:1.56.4.1 --- src/sys/compat/linux/common/linux_ipc.c:1.56 Thu Feb 21 03:37:18 2019 +++ src/sys/compat/linux/common/linux_ipc.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_ipc.c,v 1.56 2019/02/21 03:37:18 mrg Exp $ */ +/* $NetBSD: linux_ipc.c,v 1.56.4.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_ipc.c,v 1.56 2019/02/21 03:37:18 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_ipc.c,v 1.56.4.1 2019/09/13 06:25:25 martin Exp $"); #if defined(_KERNEL_OPT) #include "opt_sysv.h" @@ -568,6 +568,7 @@ linux_sys_shmctl(struct lwp *l, const st syscallarg(struct linux_shmid_ds *) buf; } */ struct shmid_ds bs; + struct ipc_perm perm; struct linux_shmid_ds ls; struct linux_shmid64_ds ls64; struct linux_shminfo64 lsi64; @@ -582,7 +583,10 @@ linux_sys_shmctl(struct lwp *l, const st switch (cmd & ~LINUX_IPC_64) { case LINUX_SHM_STAT: - shmid = IXSEQ_TO_IPCID(shmid, shmsegs[shmid].shm_perm); + error = shm_find_segment_perm_by_index(shmid, &perm); + if (error) + return error; + shmid = IXSEQ_TO_IPCID(shmid, perm); retval[0] = shmid; /*FALLTHROUGH*/ Index: src/sys/compat/linux/common/linux_misc.c diff -u src/sys/compat/linux/common/linux_misc.c:1.240 src/sys/compat/linux/common/linux_misc.c:1.240.4.1 --- src/sys/compat/linux/common/linux_misc.c:1.240 Mon Sep 3 16:29:29 2018 +++ src/sys/compat/linux/common/linux_misc.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_misc.c,v 1.240 2018/09/03 16:29:29 riastradh Exp $ */ +/* $NetBSD: linux_misc.c,v 1.240.4.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.240 2018/09/03 16:29:29 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.240.4.1 2019/09/13 06:25:25 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -240,7 +240,7 @@ linux_sys_wait4(struct lwp *l, const str # ifdef DIAGNOSTIC if (linux_options & LINUX_WAIT4_WNOTHREAD) printf("WARNING: %s: linux process %d.%d called " - "waitpid with __WNOTHREAD set!", + "waitpid with __WNOTHREAD set!\n", __FILE__, l->l_proc->p_pid, l->l_lid); # endif @@ -351,6 +351,7 @@ linux_sys_uname(struct lwp *l, const str } */ struct linux_utsname luts; + memset(&luts, 0, sizeof(luts)); strlcpy(luts.l_sysname, linux_sysname, sizeof(luts.l_sysname)); strlcpy(luts.l_nodename, hostname, sizeof(luts.l_nodename)); strlcpy(luts.l_release, linux_release, sizeof(luts.l_release)); @@ -771,6 +772,7 @@ again: * we have to worry about touching user memory outside of * the copyout() call). */ + memset(&idb, 0, sizeof(idb)); idb.d_ino = bdp->d_fileno; /* * The old readdir() call misuses the offset and reclen fields. @@ -1345,6 +1347,7 @@ linux_sys_sysinfo(struct lwp *l, const s struct linux_sysinfo si; struct loadavg *la; + memset(&si, 0, sizeof(si)); si.uptime = time_uptime; la = &averunnable; si.loads[0] = la->ldavg[0] * LINUX_SYSINFO_LOADS_SCALE / la->fscale; Index: src/sys/compat/linux/common/linux_signal.c diff -u src/sys/compat/linux/common/linux_signal.c:1.80 src/sys/compat/linux/common/linux_signal.c:1.80.8.1 --- src/sys/compat/linux/common/linux_signal.c:1.80 Sun Jan 7 21:14:38 2018 +++ src/sys/compat/linux/common/linux_signal.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_signal.c,v 1.80 2018/01/07 21:14:38 christos Exp $ */ +/* $NetBSD: linux_signal.c,v 1.80.8.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.80 2018/01/07 21:14:38 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.80.8.1 2019/09/13 06:25:25 martin Exp $"); #define COMPAT_LINUX 1 @@ -683,6 +683,7 @@ linux_to_native_sigaltstack(struct sigal void native_to_linux_sigaltstack(struct linux_sigaltstack *lss, const struct sigaltstack *bss) { + memset(lss, 0, sizeof(*lss)); lss->ss_sp = bss->ss_sp; lss->ss_size = bss->ss_size; if (bss->ss_flags & SS_ONSTACK) Index: src/sys/compat/linux/common/linux_socket.c diff -u src/sys/compat/linux/common/linux_socket.c:1.145 src/sys/compat/linux/common/linux_socket.c:1.145.4.1 --- src/sys/compat/linux/common/linux_socket.c:1.145 Thu Apr 18 17:45:12 2019 +++ src/sys/compat/linux/common/linux_socket.c Fri Sep 13 06:25:25 2019 @@ -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.145.4.1 2019/09/13 06:25:25 martin 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.145.4.1 2019/09/13 06:25:25 martin Exp $"); #if defined(_KERNEL_OPT) #include "opt_inet.h" @@ -546,6 +546,8 @@ linux_sys_sendmsg(struct lwp *l, const s case LINUX_SCM_CREDENTIALS: /* no native equivalent, just drop it */ + if (control != mtod(ctl_mbuf, void *)) + free(control, M_MBUF); m_free(ctl_mbuf); ctl_mbuf = NULL; msg.msg_control = NULL; @@ -568,14 +570,15 @@ linux_sys_sendmsg(struct lwp *l, const s /* Check the buffer is big enough */ if (__predict_false(cidx + cspace > clen)) { u_int8_t *nc; + size_t nclen; - clen = cidx + cspace; - if (clen >= PAGE_SIZE) { + nclen = cidx + cspace; + if (nclen >= PAGE_SIZE) { error = EINVAL; goto done; } nc = realloc(clen <= MLEN ? NULL : control, - clen, M_TEMP, M_WAITOK); + nclen, M_TEMP, M_WAITOK); if (!nc) { error = ENOMEM; goto done; @@ -584,6 +587,7 @@ linux_sys_sendmsg(struct lwp *l, const s /* Old buffer was in mbuf... */ memcpy(nc, control, cidx); control = nc; + clen = nclen; } /* Copy header */ @@ -605,7 +609,7 @@ linux_sys_sendmsg(struct lwp *l, const s 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) { @@ -1605,9 +1609,6 @@ linux_get_sa(struct lwp *l, int s, struc sin6->sin6_scope_id = 0; } - if (bdom == AF_INET) - namelen = sizeof(struct sockaddr_in); - sb->sb_family = bdom; sb->sb_len = namelen; ktrkuser("mbsoname", sb, namelen); Index: src/sys/compat/linux/common/linux_socket.h diff -u src/sys/compat/linux/common/linux_socket.h:1.23 src/sys/compat/linux/common/linux_socket.h:1.23.18.1 --- src/sys/compat/linux/common/linux_socket.h:1.23 Fri Feb 3 16:57:39 2017 +++ src/sys/compat/linux/common/linux_socket.h Fri Sep 13 06:25:25 2019 @@ -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.23.18.1 2019/09/13 06:25:25 martin 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)) Index: src/sys/compat/linux/common/linux_statfs.h diff -u src/sys/compat/linux/common/linux_statfs.h:1.6 src/sys/compat/linux/common/linux_statfs.h:1.6.42.1 --- src/sys/compat/linux/common/linux_statfs.h:1.6 Thu Sep 13 13:59:33 2012 +++ src/sys/compat/linux/common/linux_statfs.h Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_statfs.h,v 1.6 2012/09/13 13:59:33 pooka Exp $ */ +/* $NetBSD: linux_statfs.h,v 1.6.42.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc. @@ -48,6 +48,8 @@ bsd_to_linux_statfs(const struct statvfs { int i; + memset(lsp, 0, sizeof(*lsp)); + for (i = 0; i < linux_fstypes_cnt; i++) { if (strcmp(bsp->f_fstypename, linux_fstypes[i].mty_bsd) == 0) { lsp->l_ftype = linux_fstypes[i].mty_linux; @@ -82,7 +84,6 @@ bsd_to_linux_statfs(const struct statvfs lsp->l_ffsid.val[0] = bsp->f_fsidx.__fsid_val[0]; lsp->l_ffsid.val[1] = bsp->f_fsidx.__fsid_val[1]; lsp->l_fnamelen = bsp->f_namemax; - (void)memset(lsp->l_fspare, 0, sizeof(lsp->l_fspare)); } /* @@ -96,6 +97,8 @@ bsd_to_linux_statfs64(const struct statv { int i, div; + memset(lsp, 0, sizeof(*lsp)); + for (i = 0; i < linux_fstypes_cnt; i++) { if (strcmp(bsp->f_fstypename, linux_fstypes[i].mty_bsd) == 0) { lsp->l_ftype = linux_fstypes[i].mty_linux; @@ -121,7 +124,6 @@ bsd_to_linux_statfs64(const struct statv lsp->l_ffsid.val[0] = bsp->f_fsidx.__fsid_val[0]; lsp->l_ffsid.val[1] = bsp->f_fsidx.__fsid_val[1]; lsp->l_fnamelen = bsp->f_namemax; - (void)memset(lsp->l_fspare, 0, sizeof(lsp->l_fspare)); } #endif /* !_LINUX_STATFS_H */ Index: src/sys/compat/linux/common/linux_termios.c diff -u src/sys/compat/linux/common/linux_termios.c:1.37 src/sys/compat/linux/common/linux_termios.c:1.37.34.1 --- src/sys/compat/linux/common/linux_termios.c:1.37 Fri Dec 27 16:58:50 2013 +++ src/sys/compat/linux/common/linux_termios.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_termios.c,v 1.37 2013/12/27 16:58:50 njoly Exp $ */ +/* $NetBSD: linux_termios.c,v 1.37.34.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 1995, 1998, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_termios.c,v 1.37 2013/12/27 16:58:50 njoly Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_termios.c,v 1.37.34.1 2019/09/13 06:25:25 martin Exp $"); #if defined(_KERNEL_OPT) #include "opt_ptm.h" @@ -259,6 +259,7 @@ linux_ioctl_termios(struct lwp *l, const case LINUX_TIOCLINUX_READMOUSE: case LINUX_TIOCLINUX_VESABLANK: case LINUX_TIOCLINUX_CURCONS: /* could use VT_GETACTIVE */ + default: error = EINVAL; goto out; } Index: src/sys/compat/linux/common/linux_termios.h diff -u src/sys/compat/linux/common/linux_termios.h:1.21 src/sys/compat/linux/common/linux_termios.h:1.21.58.1 --- src/sys/compat/linux/common/linux_termios.h:1.21 Sun Sep 25 13:40:07 2011 +++ src/sys/compat/linux/common/linux_termios.h Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_termios.h,v 1.21 2011/09/25 13:40:07 chs Exp $ */ +/* $NetBSD: linux_termios.h,v 1.21.58.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -279,6 +279,7 @@ bsd_termios_to_linux_termio(struct termi { int i, mask; + memset(lt, 0, sizeof(*lt)); lt->c_iflag = 0; lt->c_iflag |= cvtto_linux_mask(bts->c_iflag, IGNBRK, LINUX_IGNBRK); lt->c_iflag |= cvtto_linux_mask(bts->c_iflag, BRKINT, LINUX_BRKINT); @@ -466,6 +467,7 @@ bsd_termios_to_linux_termios(struct term { int i, mask; + memset(lts, 0, sizeof(*lts)); lts->c_iflag = 0; lts->c_iflag |= cvtto_linux_mask(bts->c_iflag, IGNBRK, LINUX_IGNBRK); lts->c_iflag |= cvtto_linux_mask(bts->c_iflag, BRKINT, LINUX_BRKINT); Index: src/sys/compat/linux32/common/linux32_dirent.c diff -u src/sys/compat/linux32/common/linux32_dirent.c:1.19 src/sys/compat/linux32/common/linux32_dirent.c:1.19.4.1 --- src/sys/compat/linux32/common/linux32_dirent.c:1.19 Mon Sep 3 16:29:29 2018 +++ src/sys/compat/linux32/common/linux32_dirent.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_dirent.c,v 1.19 2018/09/03 16:29:29 riastradh Exp $ */ +/* $NetBSD: linux32_dirent.c,v 1.19.4.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved. @@ -33,7 +33,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_dirent.c,v 1.19 2018/09/03 16:29:29 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_dirent.c,v 1.19.4.1 2019/09/13 06:25:25 martin Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -201,6 +201,7 @@ again: * we have to worry about touching user memory outside of * the copyout() call). */ + memset(&idb, 0, sizeof(idb)); idb.d_ino = bdp->d_fileno; /* * The old readdir() call misuses the offset and reclen fields. Index: src/sys/compat/linux32/common/linux32_ioctl.c diff -u src/sys/compat/linux32/common/linux32_ioctl.c:1.13 src/sys/compat/linux32/common/linux32_ioctl.c:1.13.68.1 --- src/sys/compat/linux32/common/linux32_ioctl.c:1.13 Tue Aug 18 02:02:58 2009 +++ src/sys/compat/linux32/common/linux32_ioctl.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_ioctl.c,v 1.13 2009/08/18 02:02:58 christos Exp $ */ +/* $NetBSD: linux32_ioctl.c,v 1.13.68.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_ioctl.c,v 1.13 2009/08/18 02:02:58 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_ioctl.c,v 1.13.68.1 2019/09/13 06:25:25 martin Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -124,7 +124,9 @@ linux32_sys_ioctl(struct lwp *l, const s error = linux32_ioctl_socket(l, uap, retval); break; default: +#ifdef DEBUG_LINUX printf("Not yet implemented ioctl group \'%c\'\n", group); +#endif error = EINVAL; break; } Index: src/sys/compat/linux32/common/linux32_misc.c diff -u src/sys/compat/linux32/common/linux32_misc.c:1.26 src/sys/compat/linux32/common/linux32_misc.c:1.26.18.1 --- src/sys/compat/linux32/common/linux32_misc.c:1.26 Mon Apr 10 15:04:32 2017 +++ src/sys/compat/linux32/common/linux32_misc.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_misc.c,v 1.26 2017/04/10 15:04:32 dholland Exp $ */ +/* $NetBSD: linux32_misc.c,v 1.26.18.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.26 2017/04/10 15:04:32 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.26.18.1 2019/09/13 06:25:25 martin Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -293,11 +293,13 @@ linux32_sys_get_robust_list(struct lwp * const struct linux32_sys_get_robust_list_args *uap, register_t *retval) { /* { + syscallarg(linux32_pid_t) pid; syscallarg(linux32_robust_list_headpp_t) head; syscallarg(linux32_sizep_t) len; } */ struct linux_sys_get_robust_list_args ua; + NETBSD32TOX_UAP(pid, int); NETBSD32TOP_UAP(head, struct robust_list_head *); NETBSD32TOP_UAP(len, size_t *); return linux_sys_get_robust_list(l, &ua, retval); Index: src/sys/compat/linux32/common/linux32_signal.c diff -u src/sys/compat/linux32/common/linux32_signal.c:1.19 src/sys/compat/linux32/common/linux32_signal.c:1.19.8.1 --- src/sys/compat/linux32/common/linux32_signal.c:1.19 Sun Jan 7 21:16:00 2018 +++ src/sys/compat/linux32/common/linux32_signal.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_signal.c,v 1.19 2018/01/07 21:16:00 christos Exp $ */ +/* $NetBSD: linux32_signal.c,v 1.19.8.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_signal.c,v 1.19 2018/01/07 21:16:00 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_signal.c,v 1.19.8.1 2019/09/13 06:25:25 martin Exp $"); #include <sys/param.h> #include <sys/ucred.h> @@ -232,6 +232,7 @@ native_to_linux32_sigaction(struct linux void native_to_linux32_sigaltstack(struct linux32_sigaltstack *lss, const struct sigaltstack *bss) { + memset(lss, 0, sizeof(*lss)); NETBSD32PTR32(lss->ss_sp, bss->ss_sp); lss->ss_size = bss->ss_size; if (bss->ss_flags & SS_ONSTACK) Index: src/sys/compat/linux32/common/linux32_sysinfo.c diff -u src/sys/compat/linux32/common/linux32_sysinfo.c:1.7 src/sys/compat/linux32/common/linux32_sysinfo.c:1.7.72.1 --- src/sys/compat/linux32/common/linux32_sysinfo.c:1.7 Wed Nov 19 18:36:04 2008 +++ src/sys/compat/linux32/common/linux32_sysinfo.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_sysinfo.c,v 1.7 2008/11/19 18:36:04 ad Exp $ */ +/* $NetBSD: linux32_sysinfo.c,v 1.7.72.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved. @@ -33,7 +33,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_sysinfo.c,v 1.7 2008/11/19 18:36:04 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_sysinfo.c,v 1.7.72.1 2019/09/13 06:25:25 martin Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -70,6 +70,7 @@ linux32_sys_sysinfo(struct lwp *l, const struct linux32_sysinfo si; struct loadavg *la; + memset(&si, 0, sizeof(si)); si.uptime = time_uptime; la = &averunnable; si.loads[0] = la->ldavg[0] * LINUX_SYSINFO_LOADS_SCALE / la->fscale; Index: src/sys/compat/linux32/common/linux32_termios.c diff -u src/sys/compat/linux32/common/linux32_termios.c:1.14 src/sys/compat/linux32/common/linux32_termios.c:1.14.72.1 --- src/sys/compat/linux32/common/linux32_termios.c:1.14 Wed Nov 19 18:36:04 2008 +++ src/sys/compat/linux32/common/linux32_termios.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_termios.c,v 1.14 2008/11/19 18:36:04 ad Exp $ */ +/* $NetBSD: linux32_termios.c,v 1.14.72.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 1995-2006, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_termios.c,v 1.14 2008/11/19 18:36:04 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_termios.c,v 1.14.72.1 2019/09/13 06:25:25 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_linux32.h" @@ -262,6 +262,7 @@ linux32_ioctl_termios(struct lwp *l, con case LINUX_TIOCLINUX_READMOUSE: case LINUX_TIOCLINUX_VESABLANK: case LINUX_TIOCLINUX_CURCONS: /* could use VT_GETACTIVE */ + default: error = EINVAL; goto out; } Index: src/sys/compat/linux32/common/linux32_utsname.c diff -u src/sys/compat/linux32/common/linux32_utsname.c:1.9 src/sys/compat/linux32/common/linux32_utsname.c:1.9.72.1 --- src/sys/compat/linux32/common/linux32_utsname.c:1.9 Wed Nov 19 18:36:04 2008 +++ src/sys/compat/linux32/common/linux32_utsname.c Fri Sep 13 06:25:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_utsname.c,v 1.9 2008/11/19 18:36:04 ad Exp $ */ +/* $NetBSD: linux32_utsname.c,v 1.9.72.1 2019/09/13 06:25:25 martin Exp $ */ /*- * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved. @@ -33,7 +33,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_utsname.c,v 1.9 2008/11/19 18:36:04 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_utsname.c,v 1.9.72.1 2019/09/13 06:25:25 martin Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -81,6 +81,7 @@ linux32_sys_uname(struct lwp *l, const s struct linux_utsname luts; struct linux_utsname *lp; + memset(&luts, 0, sizeof(luts)); strlcpy(luts.l_sysname, linux32_sysname, sizeof(luts.l_sysname)); strlcpy(luts.l_nodename, hostname, sizeof(luts.l_nodename)); strlcpy(luts.l_release, linux32_release, sizeof(luts.l_release)); @@ -101,6 +102,7 @@ linux32_sys_olduname(struct lwp *l, cons } */ struct linux_oldutsname luts; + memset(&luts, 0, sizeof(luts)); strlcpy(luts.l_sysname, linux32_sysname, sizeof(luts.l_sysname)); strlcpy(luts.l_nodename, hostname, sizeof(luts.l_nodename)); strlcpy(luts.l_release, linux32_release, sizeof(luts.l_release)); @@ -118,6 +120,7 @@ linux32_sys_oldolduname(struct lwp *l, c } */ struct linux_oldoldutsname luts; + memset(&luts, 0, sizeof(luts)); strlcpy(luts.l_sysname, linux32_sysname, sizeof(luts.l_sysname)); strlcpy(luts.l_nodename, hostname, sizeof(luts.l_nodename)); strlcpy(luts.l_release, linux32_release, sizeof(luts.l_release)); Index: src/sys/compat/netbsd32/netbsd32_compat_43.c diff -u src/sys/compat/netbsd32/netbsd32_compat_43.c:1.57 src/sys/compat/netbsd32/netbsd32_compat_43.c:1.57.4.1 --- src/sys/compat/netbsd32/netbsd32_compat_43.c:1.57 Sun Jan 27 02:08:40 2019 +++ src/sys/compat/netbsd32/netbsd32_compat_43.c Fri Sep 13 06:25:26 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32_compat_43.c,v 1.57 2019/01/27 02:08:40 pgoyette Exp $ */ +/* $NetBSD: netbsd32_compat_43.c,v 1.57.4.1 2019/09/13 06:25:26 martin Exp $ */ /* * Copyright (c) 1998, 2001 Matthew R. Green @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_43.c,v 1.57 2019/01/27 02:08:40 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_43.c,v 1.57.4.1 2019/09/13 06:25:26 martin Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_43.h" @@ -77,6 +77,7 @@ static void netbsd32_from_stat(const struct stat *sb, struct netbsd32_stat43 *sp32) { + memset(sp32, 0, sizeof(*sp32)); sp32->st_dev = sb->st_dev; sp32->st_ino = sb->st_ino; sp32->st_mode = sb->st_mode; Index: src/sys/compat/ossaudio/ossaudio.c diff -u src/sys/compat/ossaudio/ossaudio.c:1.74 src/sys/compat/ossaudio/ossaudio.c:1.74.4.1 --- src/sys/compat/ossaudio/ossaudio.c:1.74 Sun Feb 3 03:19:26 2019 +++ src/sys/compat/ossaudio/ossaudio.c Fri Sep 13 06:25:26 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ossaudio.c,v 1.74 2019/02/03 03:19:26 mrg Exp $ */ +/* $NetBSD: ossaudio.c,v 1.74.4.1 2019/09/13 06:25:26 martin Exp $ */ /*- * Copyright (c) 1997, 2008 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ossaudio.c,v 1.74 2019/02/03 03:19:26 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ossaudio.c,v 1.74.4.1 2019/09/13 06:25:26 martin Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -966,7 +966,7 @@ getdevinfo(file_t *fp) } for(i = 0; i < NETBSD_MAXDEVS; i++) { mi.index = i; - if (ioctlf(fp, AUDIO_MIXER_DEVINFO, &mi) < 0) + if (ioctlf(fp, AUDIO_MIXER_DEVINFO, &mi) != 0) break; switch(mi.type) { case AUDIO_MIXER_VALUE: @@ -994,7 +994,7 @@ getdevinfo(file_t *fp) } for(i = 0; i < NETBSD_MAXDEVS; i++) { mi.index = i; - if (ioctlf(fp, AUDIO_MIXER_DEVINFO, &mi) < 0) + if (ioctlf(fp, AUDIO_MIXER_DEVINFO, &mi) != 0) break; if (strcmp(mi.label.name, AudioNsource) != 0) continue; Index: src/sys/kern/sysv_shm.c diff -u src/sys/kern/sysv_shm.c:1.135.2.1 src/sys/kern/sysv_shm.c:1.135.2.2 --- src/sys/kern/sysv_shm.c:1.135.2.1 Tue Sep 10 16:14:53 2019 +++ src/sys/kern/sysv_shm.c Fri Sep 13 06:25:26 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sysv_shm.c,v 1.135.2.1 2019/09/10 16:14:53 martin Exp $ */ +/* $NetBSD: sysv_shm.c,v 1.135.2.2 2019/09/13 06:25:26 martin Exp $ */ /*- * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.135.2.1 2019/09/10 16:14:53 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.135.2.2 2019/09/13 06:25:26 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_sysv.h" @@ -121,6 +121,26 @@ SYSCTL_SETUP_PROTO(sysctl_ipc_shm_setup) static int shmrealloc(int); /* + * Find the shared memory segment permission by the index. Only used by + * compat_linux to implement SHM_STAT. + */ +int +shm_find_segment_perm_by_index(int index, struct ipc_perm *perm) +{ + struct shmid_ds *shmseg; + + mutex_enter(&shm_lock); + if (index < 0 || index >= shminfo.shmmni) { + mutex_exit(&shm_lock); + return EINVAL; + } + shmseg = &shmsegs[index]; + memcpy(perm, &shmseg->shm_perm, sizeof(*perm)); + mutex_exit(&shm_lock); + return 0; +} + +/* * Find the shared memory segment by the identifier. * => must be called with shm_lock held; */ Index: src/sys/miscfs/procfs/procfs_linux.c diff -u src/sys/miscfs/procfs/procfs_linux.c:1.74.4.1 src/sys/miscfs/procfs/procfs_linux.c:1.74.4.2 --- src/sys/miscfs/procfs/procfs_linux.c:1.74.4.1 Tue Sep 10 16:11:00 2019 +++ src/sys/miscfs/procfs/procfs_linux.c Fri Sep 13 06:25:26 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_linux.c,v 1.74.4.1 2019/09/10 16:11:00 martin Exp $ */ +/* $NetBSD: procfs_linux.c,v 1.74.4.2 2019/09/13 06:25:26 martin Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.74.4.1 2019/09/10 16:11:00 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.74.4.2 2019/09/13 06:25:26 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -378,6 +378,7 @@ procfs_do_pid_statm(struct lwp *curl, st mutex_enter(p->p_lock); /* retrieve RSS size */ + memset(&ki, 0, sizeof(ki)); fill_kproc2(p, &ki, false, false); mutex_exit(p->p_lock); @@ -435,6 +436,7 @@ procfs_do_pid_stat(struct lwp *curl, str mutex_enter(proc_lock); mutex_enter(p->p_lock); + memset(&ki, 0, sizeof(ki)); fill_kproc2(p, &ki, false, false); calcru(p, NULL, NULL, NULL, &rt); Index: src/sys/sys/shm.h diff -u src/sys/sys/shm.h:1.52 src/sys/sys/shm.h:1.52.4.1 --- src/sys/sys/shm.h:1.52 Wed Apr 10 10:03:50 2019 +++ src/sys/sys/shm.h Fri Sep 13 06:25:26 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: shm.h,v 1.52 2019/04/10 10:03:50 pgoyette Exp $ */ +/* $NetBSD: shm.h,v 1.52.4.1 2019/09/13 06:25:26 martin Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -178,6 +178,8 @@ void shmfork(struct vmspace *, struct vm void shmexit(struct vmspace *); int shmctl1(struct lwp *, int, int, struct shmid_ds *); +int shm_find_segment_perm_by_index(int, struct ipc_perm *); + extern void (*uvm_shmexit)(struct vmspace *); extern void (*uvm_shmfork)(struct vmspace *, struct vmspace *);