Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Abort on stack overflow instead of re-raising SIGSEGV #31333

Merged
merged 1 commit into from
Feb 6, 2016

Commits on Feb 6, 2016

  1. Abort on stack overflow instead of re-raising SIGSEGV

    We use guard pages that cause the process to abort to protect against
    undefined behavior in the event of stack overflow.  We have a handler
    that catches segfaults, prints out an error message if the segfault was
    due to a stack overflow, then unregisters itself and returns to allow
    the signal to be re-raised and kill the process.
    
    This caused some confusion, as it was unexpected that safe code would be
    able to cause a segfault, while it's easy to overflow the stack in safe
    code.  To avoid this confusion, when we detect a segfault in the guard
    page, abort instead of the previous behavior of re-raising the SIGSEGV.
    
    To test this, we need to adapt the tests for segfault to actually check
    the exit status.  Doing so revealed that the existing test for segfault
    behavior was actually invalid; LLVM optimizes the explicit null pointer
    reference down to an illegal instruction, so the program aborts with
    SIGILL instead of SIGSEGV and the test didn't actually trigger the
    signal handler at all.  Use a C helper function to get a null pointer
    that LLVM can't optimize away, so we get our segfault instead.
    
    This is a [breaking-change] if anyone is relying on the exact signal
    raised to kill a process on stack overflow.
    
    Closes rust-lang#31273
    lambda committed Feb 6, 2016
    Configuration menu
    Copy the full SHA
    ee79bfa View commit details
    Browse the repository at this point in the history