diff --git a/src/lib.rs b/src/lib.rs index ee5803c..81d7e49 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -157,8 +157,7 @@ psm_stack_manipulation! { let (stack_base, allocated_stack_size) = guard.stack_area(); debug_assert!(allocated_stack_size >= requested_stack_size); set_stack_limit(Some(stack_base as usize)); - // TODO should we not pass `allocated_stack_size` here? - let panic = psm::on_stack(stack_base, requested_stack_size, move || { + let panic = psm::on_stack(stack_base, allocated_stack_size, move || { std::panic::catch_unwind(std::panic::AssertUnwindSafe(callback)).err() }); drop(guard); diff --git a/src/mmap_stack_restore_guard.rs b/src/mmap_stack_restore_guard.rs index 1e021c2..3a4f3d5 100644 --- a/src/mmap_stack_restore_guard.rs +++ b/src/mmap_stack_restore_guard.rs @@ -82,7 +82,7 @@ impl StackRestoreGuard { unsafe { ( self.mapping.add(self.page_size), - self.size_with_guard - self.page_size, + self.size_with_guard - 2 * self.page_size, ) } } @@ -103,3 +103,20 @@ fn page_size() -> usize { // FIXME: consider caching the page size. unsafe { libc::sysconf(libc::_SC_PAGE_SIZE) as usize } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_stack_area() { + for stack_size_kb in 1..64 { + let size = stack_size_kb * 1024; + let stack = StackRestoreGuard::new(size); + assert_eq!( + stack.stack_area().1, + ((size + page_size() - 1) / page_size()) * page_size() + ) + } + } +} \ No newline at end of file