diff options
| author | Dave Huseby <dhuseby@mozilla.com> | 2016-01-26 17:37:18 -0800 |
|---|---|---|
| committer | Dave Huseby <dhuseby@mozilla.com> | 2016-02-02 21:42:11 -0800 |
| commit | 0153e64d975ec175f893ad528311ef7c441a1561 (patch) | |
| tree | 077f0a232b2b2476c5373c8f9b009d6d431e8a10 /src/libstd/sys/unix/stack_overflow.rs | |
| parent | 50df6b9dc5144df09ef6b8519afd3657abdab03f (diff) | |
| download | rust-0153e64d975ec175f893ad528311ef7c441a1561.tar.gz rust-0153e64d975ec175f893ad528311ef7c441a1561.zip | |
Fixes #31229
Diffstat (limited to 'src/libstd/sys/unix/stack_overflow.rs')
| -rw-r--r-- | src/libstd/sys/unix/stack_overflow.rs | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/src/libstd/sys/unix/stack_overflow.rs b/src/libstd/sys/unix/stack_overflow.rs index c7614db3299..88ac73de2fb 100644 --- a/src/libstd/sys/unix/stack_overflow.rs +++ b/src/libstd/sys/unix/stack_overflow.rs @@ -135,17 +135,42 @@ mod imp { Handler { _data: MAIN_ALTSTACK }; } - pub unsafe fn make_handler() -> Handler { - let alt_stack = mmap(ptr::null_mut(), - SIGSTKSZ, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, - -1, - 0); - if alt_stack == MAP_FAILED { + #[cfg(any(target_os = "linux", + target_os = "macos", + target_os = "bitrig", + target_os = "netbsd", + target_os = "openbsd"))] + unsafe fn get_stack() -> *mut libc::c_void { + let stack = mmap(ptr::null_mut(), + SIGSTKSZ, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, + -1, + 0); + if stack == MAP_FAILED { + panic!("failed to allocate an alternative stack"); + } + stack + } + + #[cfg(any(target_os = "dragonfly", + target_os = "freebsd"))] + unsafe fn get_stack() -> *mut i8 { + let stack = mmap(ptr::null_mut(), + SIGSTKSZ, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, + -1, + 0); + if stack == MAP_FAILED { panic!("failed to allocate an alternative stack"); } + stack as *mut i8 + } + + pub unsafe fn make_handler() -> Handler { + let alt_stack = get_stack(); let mut stack: libc::stack_t = mem::zeroed(); stack.ss_sp = alt_stack; @@ -154,7 +179,7 @@ mod imp { sigaltstack(&stack, ptr::null_mut()); - Handler { _data: alt_stack } + Handler { _data: alt_stack as *mut libc::c_void } } pub unsafe fn drop_handler(handler: &mut Handler) { |
