From ec987c00a25ee9324161843f35e432883d8385e5 Mon Sep 17 00:00:00 2001 From: Rizwan Alam Date: Thu, 10 Sep 2026 19:20:16 +0530 Subject: [PATCH] Fix overflow in Multi::timeout_i32 --- src/multi.rs | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/multi.rs b/src/multi.rs index 00fcdcc16..75f1aa10f 100644 --- a/src/multi.rs +++ b/src/multi.rs @@ -623,13 +623,8 @@ impl Multi { } fn timeout_i32(timeout: Duration) -> i32 { - let secs = timeout.as_secs(); - if secs > (i32::MAX / 1000) as u64 { - // Duration too large, clamp at maximum value. - i32::MAX - } else { - secs as i32 * 1000 + timeout.subsec_nanos() as i32 / 1_000_000 - } + // Duration too large, clamp at maximum value. + timeout.as_millis().min(i32::MAX as u128) as i32 } /// Block until activity is detected or a timeout passes. @@ -1352,3 +1347,23 @@ impl fmt::Debug for WaitFd { .finish() } } + +#[cfg(test)] +mod tests { + use super::Multi; + use std::time::Duration; + + #[test] + fn timeout_i32_clamps_at_max() { + assert_eq!(Multi::timeout_i32(Duration::from_millis(1500)), 1500); + assert_eq!( + Multi::timeout_i32(Duration::new(2_147_483, 647_999_999)), + i32::MAX + ); + assert_eq!( + Multi::timeout_i32(Duration::new(2_147_483, 648_000_000)), + i32::MAX + ); + assert_eq!(Multi::timeout_i32(Duration::MAX), i32::MAX); + } +}