svn commit: r325518 - in stable/11/sys: amd64/amd64 i386/i386

Tijl Coosemans tijl at FreeBSD.org
Tue Nov 7 17:09:01 UTC 2017


Author: tijl
Date: Tue Nov  7 17:07:45 2017
New Revision: 325518
URL: https://svnweb.freebsd.org/changeset/base/325518

Log:
  MFC r325232
  
  Set the return address for stack entry points to zero.
  
  Stack unwinders treat zero as a stop condition.  The value on the stack can
  be non-zero because thread stacks may be arbitrary memory provided via
  pthread_attr_setstack(3) or may be recycled from previous threads.
  
  Reference:
  https://lists.freebsd.org/pipermail/freebsd-current/2017-August/066855.html
  https://lists.freebsd.org/pipermail/freebsd-current/2017-October/067254.html
  
  Discussed with:	kib

Modified:
  stable/11/sys/amd64/amd64/vm_machdep.c
  stable/11/sys/i386/i386/vm_machdep.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/amd64/amd64/vm_machdep.c
==============================================================================
--- stable/11/sys/amd64/amd64/vm_machdep.c	Tue Nov  7 16:59:52 2017	(r325517)
+++ stable/11/sys/amd64/amd64/vm_machdep.c	Tue Nov  7 17:07:45 2017	(r325518)
@@ -511,6 +511,9 @@ cpu_set_upcall(struct thread *td, void (*entry)(void *
 		   (((uintptr_t)stack->ss_sp + stack->ss_size - 4) & ~0x0f) - 4;
 		td->td_frame->tf_rip = (uintptr_t)entry;
 
+		/* Return address sentinel value to stop stack unwinding. */
+		suword32((void *)td->td_frame->tf_rsp, 0);
+
 		/* Pass the argument to the entry point. */
 		suword32((void *)(td->td_frame->tf_rsp + sizeof(int32_t)),
 		    (uint32_t)(uintptr_t)arg);
@@ -533,6 +536,9 @@ cpu_set_upcall(struct thread *td, void (*entry)(void *
 	td->td_frame->tf_fs = _ufssel;
 	td->td_frame->tf_gs = _ugssel;
 	td->td_frame->tf_flags = TF_HASSEGS;
+
+	/* Return address sentinel value to stop stack unwinding. */
+	suword((void *)td->td_frame->tf_rsp, 0);
 
 	/* Pass the argument to the entry point. */
 	td->td_frame->tf_rdi = (register_t)arg;

Modified: stable/11/sys/i386/i386/vm_machdep.c
==============================================================================
--- stable/11/sys/i386/i386/vm_machdep.c	Tue Nov  7 16:59:52 2017	(r325517)
+++ stable/11/sys/i386/i386/vm_machdep.c	Tue Nov  7 17:07:45 2017	(r325518)
@@ -530,6 +530,9 @@ cpu_set_upcall(struct thread *td, void (*entry)(void *
 	    (((int)stack->ss_sp + stack->ss_size - 4) & ~0x0f) - 4;
 	td->td_frame->tf_eip = (int)entry;
 
+	/* Return address sentinel value to stop stack unwinding. */
+	suword((void *)td->td_frame->tf_esp, 0);
+
 	/* Pass the argument to the entry point. */
 	suword((void *)(td->td_frame->tf_esp + sizeof(void *)),
 	    (int)arg);


More information about the svn-src-stable mailing list