From d216a8f643300deaa28c9f3b93063f2a0f08071f Mon Sep 17 00:00:00 2001 From: Noah Stiltner Date: Mon, 22 Dec 2025 17:16:00 -0600 Subject: [PATCH 1/6] added failing test --- src/mmap_stack_restore_guard.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/mmap_stack_restore_guard.rs b/src/mmap_stack_restore_guard.rs index 1e021c2..9ab055a 100644 --- a/src/mmap_stack_restore_guard.rs +++ b/src/mmap_stack_restore_guard.rs @@ -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 From 7b4a4be8341709b025104ce5ee52b062498cdf84 Mon Sep 17 00:00:00 2001 From: Noah Stiltner Date: Mon, 22 Dec 2025 17:27:05 -0600 Subject: [PATCH 2/6] changing a file to comment on it --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index ee5803c..ce88864 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -157,7 +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? + // TODO should we not pass `allocated_stack_size` here? let panic = psm::on_stack(stack_base, requested_stack_size, move || { std::panic::catch_unwind(std::panic::AssertUnwindSafe(callback)).err() }); From 26691f90ccc824466920408ed2d1cf3d2b7a2ecf Mon Sep 17 00:00:00 2001 From: Noah Stiltner Date: Mon, 22 Dec 2025 17:30:28 -0600 Subject: [PATCH 3/6] fixed bug found by test --- src/mmap_stack_restore_guard.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mmap_stack_restore_guard.rs b/src/mmap_stack_restore_guard.rs index 9ab055a..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, ) } } From 0f8b7c9ba7a14d9c98a8c9f4c5fcf2080bcca443 Mon Sep 17 00:00:00 2001 From: Noah Stiltner Date: Mon, 22 Dec 2025 17:56:56 -0600 Subject: [PATCH 4/6] removed fix for the test and switch to allocated_stack_size instead of requested_stack_size; results in fails --- src/lib.rs | 2 +- src/mmap_stack_restore_guard.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ce88864..ef3b97f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -158,7 +158,7 @@ psm_stack_manipulation! { 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 3a4f3d5..9ab055a 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 - 2 * self.page_size, + self.size_with_guard - self.page_size, ) } } From aadcb10898be238e8105fff9ade772ad433d966f Mon Sep 17 00:00:00 2001 From: Noah Stiltner Date: Mon, 22 Dec 2025 17:58:47 -0600 Subject: [PATCH 5/6] fixed fails by fixing my unit test again --- src/mmap_stack_restore_guard.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mmap_stack_restore_guard.rs b/src/mmap_stack_restore_guard.rs index 9ab055a..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, ) } } From 3fc137e3e44b5f7311f2965c6d41f4b6d8b7e374 Mon Sep 17 00:00:00 2001 From: Noah Stiltner Date: Mon, 22 Dec 2025 18:00:16 -0600 Subject: [PATCH 6/6] fulfilled TODO statement --- src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index ef3b97f..81d7e49 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -157,7 +157,6 @@ 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, allocated_stack_size, move || { std::panic::catch_unwind(std::panic::AssertUnwindSafe(callback)).err() });