From 0153e64d975ec175f893ad528311ef7c441a1561 Mon Sep 17 00:00:00 2001 From: Dave Huseby Date: Tue, 26 Jan 2016 17:37:18 -0800 Subject: [PATCH 1/5] Fixes #31229 --- src/libstd/sys/unix/fs.rs | 2 +- src/libstd/sys/unix/stack_overflow.rs | 43 +++++++++++++++++++++------ src/libtest/lib.rs | 10 ++----- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/libstd/sys/unix/fs.rs b/src/libstd/sys/unix/fs.rs index d2d2ce35d84a0..9da986d7fbfd5 100644 --- a/src/libstd/sys/unix/fs.rs +++ b/src/libstd/sys/unix/fs.rs @@ -224,7 +224,7 @@ impl DirEntry { fn name_bytes(&self) -> &[u8] { unsafe { ::slice::from_raw_parts(self.entry.d_name.as_ptr() as *const u8, - self.entry.d_namelen as usize) + self.entry.d_namlen as usize) } } #[cfg(any(target_os = "android", diff --git a/src/libstd/sys/unix/stack_overflow.rs b/src/libstd/sys/unix/stack_overflow.rs index c7614db329959..88ac73de2fb7b 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) { diff --git a/src/libtest/lib.rs b/src/libtest/lib.rs index 130ce3a9637f3..443356fbe7cd5 100644 --- a/src/libtest/lib.rs +++ b/src/libtest/lib.rs @@ -939,18 +939,12 @@ fn get_concurrency() -> usize { fn num_cpus() -> usize { let mut cpus: libc::c_uint = 0; let mut cpus_size = std::mem::size_of_val(&cpus); - let mut mib = [libc::CTL_HW, libc::HW_AVAILCPU, 0, 0]; unsafe { - libc::sysctl(mib.as_mut_ptr(), - 2, - &mut cpus as *mut _ as *mut _, - &mut cpus_size as *mut _ as *mut _, - 0 as *mut _, - 0); + cpus = libc::sysconf(libc::_SC_NPROCESSORS_ONLN) as libc::c_uint; } if cpus < 1 { - mib[1] = libc::HW_NCPU; + let mut mib = [libc::CTL_HW, libc::HW_NCPU, 0, 0]; unsafe { libc::sysctl(mib.as_mut_ptr(), 2, From c83128eb6064887cbc675e6fcda06161ec573802 Mon Sep 17 00:00:00 2001 From: Dave Huseby Date: Tue, 26 Jan 2016 21:37:46 -0800 Subject: [PATCH 2/5] unifying name_bytes now that the two blocks are the same --- src/libstd/sys/unix/fs.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/libstd/sys/unix/fs.rs b/src/libstd/sys/unix/fs.rs index 9da986d7fbfd5..9193181123462 100644 --- a/src/libstd/sys/unix/fs.rs +++ b/src/libstd/sys/unix/fs.rs @@ -211,14 +211,8 @@ impl DirEntry { #[cfg(any(target_os = "macos", target_os = "ios", target_os = "netbsd", - target_os = "openbsd"))] - fn name_bytes(&self) -> &[u8] { - unsafe { - ::slice::from_raw_parts(self.entry.d_name.as_ptr() as *const u8, - self.entry.d_namlen as usize) - } - } - #[cfg(any(target_os = "freebsd", + target_os = "openbsd", + target_os = "freebsd", target_os = "dragonfly", target_os = "bitrig"))] fn name_bytes(&self) -> &[u8] { From 7803c8d688b87e3d13f42d543a553201005db783 Mon Sep 17 00:00:00 2001 From: Dave Huseby Date: Wed, 27 Jan 2016 16:46:45 -0800 Subject: [PATCH 3/5] refactoring get_stack to be cleaner --- src/libstd/sys/unix/stack_overflow.rs | 47 ++++++++++++--------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/src/libstd/sys/unix/stack_overflow.rs b/src/libstd/sys/unix/stack_overflow.rs index 88ac73de2fb7b..f5353895c9dba 100644 --- a/src/libstd/sys/unix/stack_overflow.rs +++ b/src/libstd/sys/unix/stack_overflow.rs @@ -140,46 +140,39 @@ mod imp { 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 { + unsafe fn get_stack() -> libc::stack_t { + let stackp = mmap(ptr::null_mut(), + SIGSTKSZ, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, + -1, + 0); + if stackp == MAP_FAILED { panic!("failed to allocate an alternative stack"); } - stack + libc::stack_t { ss_sp: stackp, ss_flags: 0, ss_size: SIGSTKSZ } } #[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 { + unsafe fn get_stack() -> libc::stack_t { + let stackp = mmap(ptr::null_mut(), + SIGSTKSZ, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, + -1, + 0); + if stackp == MAP_FAILED { panic!("failed to allocate an alternative stack"); } - stack as *mut i8 + libc::stack_t { ss_sp: stackp as *mut i8, ss_flags: 0, ss_size: SIGSTKSZ } } pub unsafe fn make_handler() -> Handler { - let alt_stack = get_stack(); - let mut stack: libc::stack_t = mem::zeroed(); - - stack.ss_sp = alt_stack; - stack.ss_flags = 0; - stack.ss_size = SIGSTKSZ; - + let stack = get_stack(); sigaltstack(&stack, ptr::null_mut()); - - Handler { _data: alt_stack as *mut libc::c_void } + Handler { _data: stack.ss_sp as *mut libc::c_void } } pub unsafe fn drop_handler(handler: &mut Handler) { From 68bfd43eefe42b429a463731fe81d62bf9c27907 Mon Sep 17 00:00:00 2001 From: Dave Huseby Date: Tue, 2 Feb 2016 09:23:33 -0800 Subject: [PATCH 4/5] simplifying get_stack --- src/libstd/sys/unix/stack_overflow.rs | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/src/libstd/sys/unix/stack_overflow.rs b/src/libstd/sys/unix/stack_overflow.rs index f5353895c9dba..ee590e1af71a7 100644 --- a/src/libstd/sys/unix/stack_overflow.rs +++ b/src/libstd/sys/unix/stack_overflow.rs @@ -135,27 +135,7 @@ mod imp { Handler { _data: MAIN_ALTSTACK }; } - #[cfg(any(target_os = "linux", - target_os = "macos", - target_os = "bitrig", - target_os = "netbsd", - target_os = "openbsd"))] - unsafe fn get_stack() -> libc::stack_t { - let stackp = mmap(ptr::null_mut(), - SIGSTKSZ, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, - -1, - 0); - if stackp == MAP_FAILED { - panic!("failed to allocate an alternative stack"); - } - libc::stack_t { ss_sp: stackp, ss_flags: 0, ss_size: SIGSTKSZ } - } - - #[cfg(any(target_os = "dragonfly", - target_os = "freebsd"))] - unsafe fn get_stack() -> libc::stack_t { + unsafe fn get_stack() -> *mut i8 { let stackp = mmap(ptr::null_mut(), SIGSTKSZ, PROT_READ | PROT_WRITE, @@ -165,12 +145,11 @@ mod imp { if stackp == MAP_FAILED { panic!("failed to allocate an alternative stack"); } - libc::stack_t { ss_sp: stackp as *mut i8, ss_flags: 0, ss_size: SIGSTKSZ } + stackp as *mut i8 } - pub unsafe fn make_handler() -> Handler { - let stack = get_stack(); + let stack = libc::stack_t { ss_sp: get_stack(), ss_flags: 0, ss_size: SIGSTKSZ } sigaltstack(&stack, ptr::null_mut()); Handler { _data: stack.ss_sp as *mut libc::c_void } } From ca6f9203461f57a1f1a88266efeb61a5aa47d66b Mon Sep 17 00:00:00 2001 From: Dave Huseby Date: Tue, 2 Feb 2016 18:21:39 -0800 Subject: [PATCH 5/5] trying again at fixing stackp initialization --- src/libstd/sys/unix/stack_overflow.rs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/libstd/sys/unix/stack_overflow.rs b/src/libstd/sys/unix/stack_overflow.rs index ee590e1af71a7..b5cbcaa44d56c 100644 --- a/src/libstd/sys/unix/stack_overflow.rs +++ b/src/libstd/sys/unix/stack_overflow.rs @@ -135,7 +135,7 @@ mod imp { Handler { _data: MAIN_ALTSTACK }; } - unsafe fn get_stack() -> *mut i8 { + unsafe fn get_stackp() -> *mut libc::c_void { let stackp = mmap(ptr::null_mut(), SIGSTKSZ, PROT_READ | PROT_WRITE, @@ -145,11 +145,26 @@ mod imp { if stackp == MAP_FAILED { panic!("failed to allocate an alternative stack"); } - stackp as *mut i8 + stackp + } + + #[cfg(any(target_os = "linux", + target_os = "macos", + target_os = "bitrig", + target_os = "netbsd", + target_os = "openbsd"))] + unsafe fn get_stack() -> libc::stack_t { + libc::stack_t { ss_sp: get_stackp(), ss_flags: 0, ss_size: SIGSTKSZ } + } + + #[cfg(any(target_os = "freebsd", + target_os = "dragonfly"))] + unsafe fn get_stack() -> libc::stack_t { + libc::stack_t { ss_sp: get_stackp() as *mut i8, ss_flags: 0, ss_size: SIGSTKSZ } } pub unsafe fn make_handler() -> Handler { - let stack = libc::stack_t { ss_sp: get_stack(), ss_flags: 0, ss_size: SIGSTKSZ } + let stack = get_stack(); sigaltstack(&stack, ptr::null_mut()); Handler { _data: stack.ss_sp as *mut libc::c_void } }