Module Name: src
Committed By: riastradh
Date: Sun Mar 16 15:35:00 UTC 2025
Modified Files:
src/sys/arch/alpha/alpha: machdep.c
src/sys/arch/amd64/amd64: machdep.c
src/sys/arch/hppa/hppa: machdep.c
src/sys/arch/i386/i386: machdep.c
src/sys/arch/ia64/ia64: machdep.c
src/sys/arch/m68k/m68k: m68k_machdep.c
src/sys/arch/mips/mips: mips_machdep.c
src/sys/arch/sh3/sh3: sh3_machdep.c
src/sys/arch/vax/vax: trap.c
src/tests/kernel: t_execregs.c
Log Message:
Clear trapframe on exec.
Do this for all architectures, even if the trapframe is fully
initialized -- makes it easier to audit and be confident it's
correct, and most likely (with the exception of sh3 which has an
intermediate call to ufetch_int in the middle) the compiler can
eliminate redundant stores in these routines.
PR kern/59084: exec/spawn leaks register content
To generate a diff of this commit:
cvs rdiff -u -r1.379 -r1.380 src/sys/arch/alpha/alpha/machdep.c
cvs rdiff -u -r1.371 -r1.372 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/hppa/hppa/machdep.c
cvs rdiff -u -r1.843 -r1.844 src/sys/arch/i386/i386/machdep.c
cvs rdiff -u -r1.45 -r1.46 src/sys/arch/ia64/ia64/machdep.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/m68k/m68k/m68k_machdep.c
cvs rdiff -u -r1.306 -r1.307 src/sys/arch/mips/mips/mips_machdep.c
cvs rdiff -u -r1.113 -r1.114 src/sys/arch/sh3/sh3/sh3_machdep.c
cvs rdiff -u -r1.138 -r1.139 src/sys/arch/vax/vax/trap.c
cvs rdiff -u -r1.3 -r1.4 src/tests/kernel/t_execregs.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/arch/alpha/alpha/machdep.c
diff -u src/sys/arch/alpha/alpha/machdep.c:1.379 src/sys/arch/alpha/alpha/machdep.c:1.380
--- src/sys/arch/alpha/alpha/machdep.c:1.379 Sun Mar 31 17:13:29 2024
+++ src/sys/arch/alpha/alpha/machdep.c Sun Mar 16 15:34:59 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.379 2024/03/31 17:13:29 thorpej Exp $ */
+/* $NetBSD: machdep.c,v 1.380 2025/03/16 15:34:59 riastradh Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000, 2019, 2020 The NetBSD Foundation, Inc.
@@ -69,7 +69,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.379 2024/03/31 17:13:29 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.380 2025/03/16 15:34:59 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1684,11 +1684,11 @@ setregs(register struct lwp *l, struct e
panic("crash requested by boot flags");
#endif
+ memset(tfp, 0, sizeof(*tfp));
+
#ifdef DEBUG
for (i = 0; i < FRAME_SIZE; i++)
tfp->tf_regs[i] = 0xbabefacedeadbeef;
-#else
- memset(tfp->tf_regs, 0, FRAME_SIZE * sizeof tfp->tf_regs[0]);
#endif
pcb = lwp_getpcb(l);
memset(&pcb->pcb_fp, 0, sizeof(pcb->pcb_fp));
Index: src/sys/arch/amd64/amd64/machdep.c
diff -u src/sys/arch/amd64/amd64/machdep.c:1.371 src/sys/arch/amd64/amd64/machdep.c:1.372
--- src/sys/arch/amd64/amd64/machdep.c:1.371 Wed Jan 22 10:03:55 2025
+++ src/sys/arch/amd64/amd64/machdep.c Sun Mar 16 15:34:59 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.371 2025/01/22 10:03:55 riastradh Exp $ */
+/* $NetBSD: machdep.c,v 1.372 2025/03/16 15:34:59 riastradh Exp $ */
/*
* Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011
@@ -110,7 +110,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.371 2025/01/22 10:03:55 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.372 2025/03/16 15:34:59 riastradh Exp $");
#include "opt_modular.h"
#include "opt_user_ldt.h"
@@ -1388,6 +1388,8 @@ setregs(struct lwp *l, struct exec_packa
kpreempt_enable();
tf = l->l_md.md_regs;
+ memset(tf, 0, sizeof(*tf));
+
tf->tf_ds = GSEL(GUDATA_SEL, SEL_UPL);
tf->tf_es = GSEL(GUDATA_SEL, SEL_UPL);
tf->tf_rdi = 0;
Index: src/sys/arch/hppa/hppa/machdep.c
diff -u src/sys/arch/hppa/hppa/machdep.c:1.21 src/sys/arch/hppa/hppa/machdep.c:1.22
--- src/sys/arch/hppa/hppa/machdep.c:1.21 Wed Apr 17 07:47:48 2024
+++ src/sys/arch/hppa/hppa/machdep.c Sun Mar 16 15:34:59 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.21 2024/04/17 07:47:48 macallan Exp $ */
+/* $NetBSD: machdep.c,v 1.22 2025/03/16 15:34:59 riastradh Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.21 2024/04/17 07:47:48 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.22 2025/03/16 15:34:59 riastradh Exp $");
#include "opt_cputype.h"
#include "opt_ddb.h"
@@ -1889,6 +1889,22 @@ setregs(struct lwp *l, struct exec_packa
struct trapframe *tf = l->l_md.md_regs;
struct pcb *pcb = lwp_getpcb(l);
+ memset(tf, 0, sizeof(*tf));
+
+ /*
+ * Initialize the External Interrupt Enable Mask, Processor
+ * Status Word, and NetBSD's floating-point register area
+ * pointer to the correct defaults for a user process.
+ *
+ * XXXMPSAFE If curcpu()->ci_eiem can vary from CPU to CPU, we
+ * have bigger problems here -- if the lwp is migrated from one
+ * CPU to another CPU between when the trapframe is saved and
+ * when the trapframe is restored, it might be invalidated.
+ */
+ tf->tf_eiem = curcpu()->ci_eiem;
+ tf->tf_ipsw = PSW_MBS | (hppa_cpu_ispa20_p() ? PSW_O : 0);
+ tf->tf_cr30 = (u_int)pcb->pcb_fpregs;
+
tf->tf_flags = TFF_SYS|TFF_LAST;
tf->tf_iioq_tail = 4 +
(tf->tf_iioq_head = pack->ep_entry | HPPA_PC_PRIV_USER);
@@ -1906,6 +1922,7 @@ setregs(struct lwp *l, struct exec_packa
/* reset any of the pending FPU exceptions */
hppa_fpu_flush(l);
+ memset(pcb->pcb_fpregs, 0, sizeof(*pcb->pcb_fpregs));
pcb->pcb_fpregs->fpr_regs[0] = ((uint64_t)HPPA_FPU_INIT) << 32;
pcb->pcb_fpregs->fpr_regs[1] = 0;
pcb->pcb_fpregs->fpr_regs[2] = 0;
Index: src/sys/arch/i386/i386/machdep.c
diff -u src/sys/arch/i386/i386/machdep.c:1.843 src/sys/arch/i386/i386/machdep.c:1.844
--- src/sys/arch/i386/i386/machdep.c:1.843 Tue Feb 18 10:16:03 2025
+++ src/sys/arch/i386/i386/machdep.c Sun Mar 16 15:34:59 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.843 2025/02/18 10:16:03 imil Exp $ */
+/* $NetBSD: machdep.c,v 1.844 2025/03/16 15:34:59 riastradh Exp $ */
/*
* Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008, 2009, 2017
@@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.843 2025/02/18 10:16:03 imil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.844 2025/03/16 15:34:59 riastradh Exp $");
#include "opt_beep.h"
#include "opt_compat_freebsd.h"
@@ -859,6 +859,8 @@ setregs(struct lwp *l, struct exec_packa
x86_dbregs_clear(l);
tf = l->l_md.md_regs;
+ memset(tf, 0, sizeof(*tf));
+
tf->tf_gs = GSEL(GUGS_SEL, SEL_UPL);
tf->tf_fs = GSEL(GUFS_SEL, SEL_UPL);
tf->tf_es = LSEL(LUDATA_SEL, SEL_UPL);
Index: src/sys/arch/ia64/ia64/machdep.c
diff -u src/sys/arch/ia64/ia64/machdep.c:1.45 src/sys/arch/ia64/ia64/machdep.c:1.46
--- src/sys/arch/ia64/ia64/machdep.c:1.45 Fri Oct 6 11:45:16 2023
+++ src/sys/arch/ia64/ia64/machdep.c Sun Mar 16 15:34:59 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.45 2023/10/06 11:45:16 skrll Exp $ */
+/* $NetBSD: machdep.c,v 1.46 2025/03/16 15:34:59 riastradh Exp $ */
/*-
* Copyright (c) 2003,2004 Marcel Moolenaar
@@ -710,6 +710,8 @@ setregs(register struct lwp *l, struct e
vaddr_t uv = uvm_lwp_getuarea(l);
tf = l->l_md.md_tf;
+ memset(tf, 0, sizeof(*tf));
+
regstkp = uv + sizeof(struct pcb);
ksttop =
Index: src/sys/arch/m68k/m68k/m68k_machdep.c
diff -u src/sys/arch/m68k/m68k/m68k_machdep.c:1.11 src/sys/arch/m68k/m68k/m68k_machdep.c:1.12
--- src/sys/arch/m68k/m68k/m68k_machdep.c:1.11 Tue Sep 26 12:46:30 2023
+++ src/sys/arch/m68k/m68k/m68k_machdep.c Sun Mar 16 15:34:59 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: m68k_machdep.c,v 1.11 2023/09/26 12:46:30 tsutsui Exp $ */
+/* $NetBSD: m68k_machdep.c,v 1.12 2025/03/16 15:34:59 riastradh Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: m68k_machdep.c,v 1.11 2023/09/26 12:46:30 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: m68k_machdep.c,v 1.12 2025/03/16 15:34:59 riastradh Exp $");
#include "opt_compat_sunos.h"
@@ -93,6 +93,8 @@ setregs(struct lwp *l, struct exec_packa
struct trapframe *tf = (struct trapframe *)l->l_md.md_regs;
struct pcb *pcb = lwp_getpcb(l);
+ memset(tf, 0, sizeof(*tf));
+
tf->tf_sr = PSL_USERSET;
tf->tf_pc = pack->ep_entry & ~1;
tf->tf_regs[D0] = 0;
Index: src/sys/arch/mips/mips/mips_machdep.c
diff -u src/sys/arch/mips/mips/mips_machdep.c:1.306 src/sys/arch/mips/mips/mips_machdep.c:1.307
--- src/sys/arch/mips/mips/mips_machdep.c:1.306 Sat Jan 6 07:27:35 2024
+++ src/sys/arch/mips/mips/mips_machdep.c Sun Mar 16 15:34:59 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: mips_machdep.c,v 1.306 2024/01/06 07:27:35 simonb Exp $ */
+/* $NetBSD: mips_machdep.c,v 1.307 2025/03/16 15:34:59 riastradh Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -111,7 +111,7 @@
*/
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.306 2024/01/06 07:27:35 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.307 2025/03/16 15:34:59 riastradh Exp $");
#define __INTR_PRIVATE
#include "opt_cputype.h"
@@ -1697,7 +1697,7 @@ setregs(struct lwp *l, struct exec_packa
struct trapframe * const tf = l->l_md.md_utf;
struct proc * const p = l->l_proc;
- memset(tf, 0, sizeof(struct trapframe));
+ memset(tf, 0, sizeof(*tf));
tf->tf_regs[_R_SP] = (intptr_t)stack;
tf->tf_regs[_R_PC] = (intptr_t)pack->ep_entry & ~3;
tf->tf_regs[_R_T9] = (intptr_t)pack->ep_entry & ~3; /* abicall requirement */
Index: src/sys/arch/sh3/sh3/sh3_machdep.c
diff -u src/sys/arch/sh3/sh3/sh3_machdep.c:1.113 src/sys/arch/sh3/sh3/sh3_machdep.c:1.114
--- src/sys/arch/sh3/sh3/sh3_machdep.c:1.113 Wed Dec 20 15:34:45 2023
+++ src/sys/arch/sh3/sh3/sh3_machdep.c Sun Mar 16 15:34:59 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: sh3_machdep.c,v 1.113 2023/12/20 15:34:45 thorpej Exp $ */
+/* $NetBSD: sh3_machdep.c,v 1.114 2025/03/16 15:34:59 riastradh Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2002 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sh3_machdep.c,v 1.113 2023/12/20 15:34:45 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sh3_machdep.c,v 1.114 2025/03/16 15:34:59 riastradh Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -518,6 +518,7 @@ setregs(struct lwp *l, struct exec_packa
l->l_md.md_flags &= ~(MDL_USEDFPU | MDL_SSTEP);
tf = l->l_md.md_regs;
+ memset(tf, 0, sizeof(*tf));
tf->tf_ssr = PSL_USERSET;
tf->tf_spc = pack->ep_entry;
Index: src/sys/arch/vax/vax/trap.c
diff -u src/sys/arch/vax/vax/trap.c:1.138 src/sys/arch/vax/vax/trap.c:1.139
--- src/sys/arch/vax/vax/trap.c:1.138 Thu Oct 5 19:41:06 2023
+++ src/sys/arch/vax/vax/trap.c Sun Mar 16 15:35:00 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.138 2023/10/05 19:41:06 ad Exp $ */
+/* $NetBSD: trap.c,v 1.139 2025/03/16 15:35:00 riastradh Exp $ */
/*
* Copyright (c) 1994 Ludd, University of Lule}, Sweden.
@@ -28,7 +28,7 @@
/* All bugs are subject to removal without further notice */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.138 2023/10/05 19:41:06 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.139 2025/03/16 15:35:00 riastradh Exp $");
#include "opt_ddb.h"
#include "opt_multiprocessor.h"
@@ -371,6 +371,8 @@ setregs(struct lwp *l, struct exec_packa
{
struct trapframe * const tf = l->l_md.md_utf;
+ memset(tf, 0, sizeof(*tf));
+
tf->tf_pc = pack->ep_entry + 2;
tf->tf_sp = stack;
tf->tf_r6 = stack; /* for ELF */
Index: src/tests/kernel/t_execregs.c
diff -u src/tests/kernel/t_execregs.c:1.3 src/tests/kernel/t_execregs.c:1.4
--- src/tests/kernel/t_execregs.c:1.3 Fri Feb 28 16:08:42 2025
+++ src/tests/kernel/t_execregs.c Sun Mar 16 15:35:00 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: t_execregs.c,v 1.3 2025/02/28 16:08:42 riastradh Exp $ */
+/* $NetBSD: t_execregs.c,v 1.4 2025/03/16 15:35:00 riastradh Exp $ */
/*-
* Copyright (c) 2025 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_execregs.c,v 1.3 2025/02/28 16:08:42 riastradh Exp $");
+__RCSID("$NetBSD: t_execregs.c,v 1.4 2025/03/16 15:35:00 riastradh Exp $");
#include <sys/wait.h>
@@ -80,13 +80,6 @@ checkregs(const register_t regs[static N
}
#endif
-#if defined(__hppa__) || \
- defined(__ia64__) || \
- defined(__vax__) || \
- defined(__x86_64__)
- atf_tc_expect_fail("PR kern/59084: exec/spawn leaks register content");
-#endif
-
for (i = 0; i < NEXECREGS; i++) {
if (regs[i] != 0) {
for (i = 0; i < NEXECREGS; i++) {