Skip to content

Commit 4b661a2

Browse files
authored
Fix some overflows when allocating a max-size fiber stack (#12868)
* Fix some overflows when allocating a max-size fiber stack These are some minor issues that won't actually surface in practice but seem good to fix nonetheless. Allocating a max-size fiber stack should fail, and it shouldn't fail with a panic or a debug assert. * Fix CI
1 parent 8268b1d commit 4b661a2

3 files changed

Lines changed: 17 additions & 3 deletions

File tree

crates/fiber/src/lib.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,4 +428,13 @@ mod tests {
428428
assert_eq!(fiber.resume(2.0), Err(4));
429429
assert_eq!(fiber.resume(3.0), Ok("hello".to_string()));
430430
}
431+
432+
#[test]
433+
fn fiber_stack_max_size() {
434+
if cfg!(windows) {
435+
return;
436+
}
437+
assert!(FiberStack::new(usize::MAX, true).is_err());
438+
assert!(FiberStack::new(usize::MAX, false).is_err());
439+
}
431440
}

crates/fiber/src/nostd.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl FiberStack {
6767
// Round up the size to at least one page.
6868
let size = core::cmp::max(4096, size);
6969
let mut storage = Vec::new();
70-
storage.reserve_exact(size);
70+
storage.try_reserve_exact(size)?;
7171
if zeroed {
7272
storage.resize(size, 0);
7373
}

crates/fiber/src/unix.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,10 @@ impl MmapFiberStack {
175175
let size = if size == 0 {
176176
page_size
177177
} else {
178-
(size + (page_size - 1)) & (!(page_size - 1))
178+
let with_extra = size
179+
.checked_add(page_size - 1)
180+
.ok_or(io::ErrorKind::OutOfMemory)?;
181+
with_extra & (!(page_size - 1))
179182
};
180183

181184
unsafe {
@@ -451,7 +454,9 @@ mod asan {
451454

452455
pub fn new_fiber_stack(size: usize) -> std::io::Result<Box<dyn RuntimeFiberStack>> {
453456
let page_size = host_page_size();
454-
let needed_size = size + page_size;
457+
let needed_size = size
458+
.checked_add(page_size)
459+
.ok_or(std::io::ErrorKind::OutOfMemory)?;
455460
let mut stacks = FIBER_STACKS.lock().unwrap();
456461

457462
let stack = match stacks.iter().position(|i| needed_size <= i.mapping_len) {

0 commit comments

Comments
 (0)