Author: tijl
Date: Tue Oct 31 11:51:34 2017
New Revision: 325232
URL: https://svnweb.freebsd.org/changeset/base/325232

Log:
  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
  MFC after:    1 week

Modified:
  head/sys/amd64/amd64/vm_machdep.c
  head/sys/i386/i386/vm_machdep.c

Modified: head/sys/amd64/amd64/vm_machdep.c
==============================================================================
--- head/sys/amd64/amd64/vm_machdep.c   Tue Oct 31 11:29:16 2017        
(r325231)
+++ head/sys/amd64/amd64/vm_machdep.c   Tue Oct 31 11:51:34 2017        
(r325232)
@@ -508,6 +508,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);
@@ -530,6 +533,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: head/sys/i386/i386/vm_machdep.c
==============================================================================
--- head/sys/i386/i386/vm_machdep.c     Tue Oct 31 11:29:16 2017        
(r325231)
+++ head/sys/i386/i386/vm_machdep.c     Tue Oct 31 11:51:34 2017        
(r325232)
@@ -524,6 +524,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);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to