Module Name: src Committed By: chs Date: Sun Feb 9 16:41:42 UTC 2014
Modified Files: src/sys/compat/linux/arch/alpha: linux_exec.h src/sys/compat/linux/arch/arm: linux_exec.h src/sys/compat/linux/arch/i386: linux_exec.h src/sys/compat/linux/arch/m68k: linux_exec.h src/sys/compat/linux/arch/mips: linux_exec.h src/sys/compat/linux/arch/powerpc: linux_exec.h src/sys/compat/linux/common: linux_exec.h linux_exec_elf32.c src/sys/compat/linux32/arch/amd64: linux32_exec.h src/sys/compat/linux32/common: linux32_exec_elf32.c Log Message: account for the 16 bytes of AT_RANDOM data in the stack setup. fixes PR 48518. use cprng_strong32() instead of random(). add AT_RANDOM support for linux32. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/compat/linux/arch/alpha/linux_exec.h cvs rdiff -u -r1.8 -r1.9 src/sys/compat/linux/arch/arm/linux_exec.h cvs rdiff -u -r1.11 -r1.12 src/sys/compat/linux/arch/i386/linux_exec.h cvs rdiff -u -r1.10 -r1.11 src/sys/compat/linux/arch/m68k/linux_exec.h cvs rdiff -u -r1.14 -r1.15 src/sys/compat/linux/arch/mips/linux_exec.h cvs rdiff -u -r1.22 -r1.23 src/sys/compat/linux/arch/powerpc/linux_exec.h cvs rdiff -u -r1.49 -r1.50 src/sys/compat/linux/common/linux_exec.h cvs rdiff -u -r1.87 -r1.88 src/sys/compat/linux/common/linux_exec_elf32.c cvs rdiff -u -r1.4 -r1.5 src/sys/compat/linux32/arch/amd64/linux32_exec.h cvs rdiff -u -r1.13 -r1.14 src/sys/compat/linux32/common/linux32_exec_elf32.c 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/alpha/linux_exec.h diff -u src/sys/compat/linux/arch/alpha/linux_exec.h:1.11 src/sys/compat/linux/arch/alpha/linux_exec.h:1.12 --- src/sys/compat/linux/arch/alpha/linux_exec.h:1.11 Mon Apr 28 20:23:42 2008 +++ src/sys/compat/linux/arch/alpha/linux_exec.h Sun Feb 9 16:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec.h,v 1.11 2008/04/28 20:23:42 martin Exp $ */ +/* $NetBSD: linux_exec.h,v 1.12 2014/02/09 16:41:42 chs Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -47,7 +47,8 @@ /* * Alpha specific ELF defines. */ -#define LINUX_ELF_AUX_ARGSIZ howmany(sizeof(Aux64Info) * LINUX_ELF_AUX_ENTRIES, sizeof(char *)) +#define LINUX_ELF_AUX_ARGSIZ \ + (howmany(sizeof(Aux64Info) * LINUX_ELF_AUX_ENTRIES, sizeof(char *)) + LINUX_RANDOM_BYTES) #define linux_exec_setup_stack exec_setup_stack Index: src/sys/compat/linux/arch/arm/linux_exec.h diff -u src/sys/compat/linux/arch/arm/linux_exec.h:1.8 src/sys/compat/linux/arch/arm/linux_exec.h:1.9 --- src/sys/compat/linux/arch/arm/linux_exec.h:1.8 Mon Apr 28 20:23:42 2008 +++ src/sys/compat/linux/arch/arm/linux_exec.h Sun Feb 9 16:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec.h,v 1.8 2008/04/28 20:23:42 martin Exp $ */ +/* $NetBSD: linux_exec.h,v 1.9 2014/02/09 16:41:42 chs Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ #define LINUX_MID_MACHINE LINUX_M_ARM #define LINUX_ELF_AUX_ARGSIZ \ - (howmany(LINUX_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr))) + (howmany(LINUX_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr)) + LINUX_RANDOM_BYTES) #define linux_exec_setup_stack exec_setup_stack Index: src/sys/compat/linux/arch/i386/linux_exec.h diff -u src/sys/compat/linux/arch/i386/linux_exec.h:1.11 src/sys/compat/linux/arch/i386/linux_exec.h:1.12 --- src/sys/compat/linux/arch/i386/linux_exec.h:1.11 Wed Mar 21 03:20:22 2012 +++ src/sys/compat/linux/arch/i386/linux_exec.h Sun Feb 9 16:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec.h,v 1.11 2012/03/21 03:20:22 chs Exp $ */ +/* $NetBSD: linux_exec.h,v 1.12 2014/02/09 16:41:42 chs Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -37,7 +37,7 @@ #define LINUX_USRSTACK 0xC0000000 #define LINUX_ELF_AUX_ARGSIZ \ - (howmany(LINUX_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr))) + (howmany(LINUX_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr)) + LINUX_RANDOM_BYTES) #define LINUX_DEBUGLINK_SIGNATURE Index: src/sys/compat/linux/arch/m68k/linux_exec.h diff -u src/sys/compat/linux/arch/m68k/linux_exec.h:1.10 src/sys/compat/linux/arch/m68k/linux_exec.h:1.11 --- src/sys/compat/linux/arch/m68k/linux_exec.h:1.10 Mon Apr 28 20:23:42 2008 +++ src/sys/compat/linux/arch/m68k/linux_exec.h Sun Feb 9 16:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec.h,v 1.10 2008/04/28 20:23:42 martin Exp $ */ +/* $NetBSD: linux_exec.h,v 1.11 2014/02/09 16:41:42 chs Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -41,7 +41,7 @@ #define LINUX_GCC_SIGNATURE 1 #define LINUX_ELF_AUX_ARGSIZ \ - (howmany(LINUX_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr))) + (howmany(LINUX_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr)) + LINUX_RANDOM_BYTES) #define linux_exec_setup_stack exec_setup_stack Index: src/sys/compat/linux/arch/mips/linux_exec.h diff -u src/sys/compat/linux/arch/mips/linux_exec.h:1.14 src/sys/compat/linux/arch/mips/linux_exec.h:1.15 --- src/sys/compat/linux/arch/mips/linux_exec.h:1.14 Thu Aug 13 03:56:32 2009 +++ src/sys/compat/linux/arch/mips/linux_exec.h Sun Feb 9 16:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec.h,v 1.14 2009/08/13 03:56:32 matt Exp $ */ +/* $NetBSD: linux_exec.h,v 1.15 2014/02/09 16:41:42 chs Exp $ */ /*- * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. @@ -59,7 +59,7 @@ #define LINUX_GCC_SIGNATURE 1 #define LINUX_ELF_AUX_ARGSIZ \ - ((howmany(LINUX_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr)))) + (howmany(LINUX_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr)) + LINUX_RANDOM_BYTES) #define linux_exec_setup_stack exec_setup_stack Index: src/sys/compat/linux/arch/powerpc/linux_exec.h diff -u src/sys/compat/linux/arch/powerpc/linux_exec.h:1.22 src/sys/compat/linux/arch/powerpc/linux_exec.h:1.23 --- src/sys/compat/linux/arch/powerpc/linux_exec.h:1.22 Sat Jan 25 10:14:29 2014 +++ src/sys/compat/linux/arch/powerpc/linux_exec.h Sun Feb 9 16:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec.h,v 1.22 2014/01/25 10:14:29 skrll Exp $ */ +/* $NetBSD: linux_exec.h,v 1.23 2014/02/09 16:41:42 chs Exp $ */ /*- * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. @@ -81,8 +81,7 @@ * by PowerPC GNU ld.so). */ #define LINUX_ELF_AUX_ARGSIZ \ - ((howmany(LINUX_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr))) \ - + 16) + (howmany(LINUX_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr)) + LINUX_RANDOM_BYTES + 16) /* we have special powerpc ELF copyargs */ #define LINUX_MACHDEP_ELF_COPYARGS Index: src/sys/compat/linux/common/linux_exec.h diff -u src/sys/compat/linux/common/linux_exec.h:1.49 src/sys/compat/linux/common/linux_exec.h:1.50 --- src/sys/compat/linux/common/linux_exec.h:1.49 Mon Nov 18 01:32:22 2013 +++ src/sys/compat/linux/common/linux_exec.h Sun Feb 9 16:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec.h,v 1.49 2013/11/18 01:32:22 chs Exp $ */ +/* $NetBSD: linux_exec.h,v 1.50 2014/02/09 16:41:42 chs Exp $ */ /*- * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. @@ -100,6 +100,8 @@ #define LINUX_AT_SYSINFO 32 /* pointer to __kernel_vsyscall */ #define LINUX_AT_SYSINFO_EHDR 33 /* pointer to ELF header */ +#define LINUX_RANDOM_BYTES 16 /* 16 bytes for AT_RANDOM */ + /* * Emulation specific sysctls. */ Index: src/sys/compat/linux/common/linux_exec_elf32.c diff -u src/sys/compat/linux/common/linux_exec_elf32.c:1.87 src/sys/compat/linux/common/linux_exec_elf32.c:1.88 --- src/sys/compat/linux/common/linux_exec_elf32.c:1.87 Mon Nov 18 01:32:22 2013 +++ src/sys/compat/linux/common/linux_exec_elf32.c Sun Feb 9 16:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec_elf32.c,v 1.87 2013/11/18 01:32:22 chs Exp $ */ +/* $NetBSD: linux_exec_elf32.c,v 1.88 2014/02/09 16:41:42 chs Exp $ */ /*- * Copyright (c) 1995, 1998, 2000, 2001 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_exec_elf32.c,v 1.87 2013/11/18 01:32:22 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_exec_elf32.c,v 1.88 2014/02/09 16:41:42 chs Exp $"); #ifndef ELFSIZE /* XXX should die */ @@ -54,6 +54,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux_exec_e #include <sys/exec_elf.h> #include <sys/stat.h> #include <sys/kauth.h> +#include <sys/cprng.h> #include <sys/mman.h> #include <sys/syscallargs.h> @@ -483,10 +484,10 @@ ELFNAME2(linux,copyargs)(struct lwp *l, a->a_v = 0; a++; - randbytes[0] = random(); - randbytes[1] = random(); - randbytes[2] = random(); - randbytes[3] = random(); + randbytes[0] = cprng_strong32(); + randbytes[1] = cprng_strong32(); + randbytes[2] = cprng_strong32(); + randbytes[3] = cprng_strong32(); len = sizeof(randbytes); if ((error = copyout(randbytes, *stackp, len)) != 0) Index: src/sys/compat/linux32/arch/amd64/linux32_exec.h diff -u src/sys/compat/linux32/arch/amd64/linux32_exec.h:1.4 src/sys/compat/linux32/arch/amd64/linux32_exec.h:1.5 --- src/sys/compat/linux32/arch/amd64/linux32_exec.h:1.4 Wed Jul 7 01:30:35 2010 +++ src/sys/compat/linux32/arch/amd64/linux32_exec.h Sun Feb 9 16:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_exec.h,v 1.4 2010/07/07 01:30:35 chs Exp $ */ +/* $NetBSD: linux32_exec.h,v 1.5 2014/02/09 16:41:42 chs Exp $ */ /*- * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved. @@ -43,6 +43,8 @@ #define LINUX32_ELF_AUX_ENTRIES 14 +#define LINUX32_RANDOM_BYTES 16 /* 16 bytes for AT_RANDOM */ + #if 0 /* Hardware platform identifier string */ @@ -75,7 +77,7 @@ struct linux32_extra_stack_data { #endif #define LINUX32_ELF_AUX_ARGSIZ \ - (howmany(LINUX32_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr))) + (howmany(LINUX32_ELF_AUX_ENTRIES * sizeof(Aux32Info), sizeof(Elf32_Addr)) + LINUX32_RANDOM_BYTES) #ifdef _KERNEL int linux32_exec_setup_stack(struct lwp *, struct exec_package *); Index: src/sys/compat/linux32/common/linux32_exec_elf32.c diff -u src/sys/compat/linux32/common/linux32_exec_elf32.c:1.13 src/sys/compat/linux32/common/linux32_exec_elf32.c:1.14 --- src/sys/compat/linux32/common/linux32_exec_elf32.c:1.13 Fri Feb 3 20:11:54 2012 +++ src/sys/compat/linux32/common/linux32_exec_elf32.c Sun Feb 9 16:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_exec_elf32.c,v 1.13 2012/02/03 20:11:54 matt Exp $ */ +/* $NetBSD: linux32_exec_elf32.c,v 1.14 2014/02/09 16:41:42 chs Exp $ */ /*- * Copyright (c) 1995, 1998, 2000, 2001,2006 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_exec_elf32.c,v 1.13 2012/02/03 20:11:54 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_exec_elf32.c,v 1.14 2014/02/09 16:41:42 chs Exp $"); #define ELFSIZE 32 @@ -46,6 +46,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux32_exec #include <sys/resourcevar.h> #include <sys/signal.h> #include <sys/signalvar.h> +#include <sys/cprng.h> #include <compat/linux/common/linux_exec.h> #include <compat/netbsd32/netbsd32.h> @@ -107,6 +108,7 @@ linux32_elf32_copyargs(struct lwp *l, st struct ps_strings *arginfo, char **stackp, void *argp) { Aux32Info ai[LINUX32_ELF_AUX_ENTRIES], *a; + uint32_t randbytes[4]; struct elf_args *ap; struct vattr *vap; size_t len; @@ -184,6 +186,10 @@ linux32_elf32_copyargs(struct lwp *l, st a->a_v = 0; a++; + a->a_type = LINUX_AT_RANDOM; + a->a_v = NETBSD32PTR32I(*stackp); + a++; + #if 0 a->a_type = LINUX_AT_SYSINFO; a->a_v = NETBSD32PTR32I(&esdp->kernel_vsyscall[0]); @@ -206,6 +212,16 @@ linux32_elf32_copyargs(struct lwp *l, st a->a_v = 0; a++; + randbytes[0] = cprng_strong32(); + randbytes[1] = cprng_strong32(); + randbytes[2] = cprng_strong32(); + randbytes[3] = cprng_strong32(); + + len = sizeof(randbytes); + if ((error = copyout(randbytes, *stackp, len)) != 0) + return error; + *stackp += len; + #if 0 memcpy(esd.kernel_vsyscall, linux32_kernel_vsyscall, sizeof(linux32_kernel_vsyscall));