diff --git a/src/header/time/mod.rs b/src/header/time/mod.rs index 7a1bbd7845..2a90455105 100644 --- a/src/header/time/mod.rs +++ b/src/header/time/mod.rs @@ -48,7 +48,7 @@ pub use strptime::strptime; const YEARS_PER_ERA: time_t = 400; const DAYS_PER_ERA: time_t = 146097; const SECS_PER_DAY: time_t = 24 * 60 * 60; -const NANOSECONDS: i64 = 1_000_000_000; +const NANOSECONDS: c_long = 1_000_000_000; const UTC_STR: &core::ffi::CStr = c"UTC"; /// See . @@ -64,32 +64,40 @@ impl timespec { /// similar logic with timeradd pub fn add(base: timespec, interval: timespec) -> Option { - let delta_sec = base.tv_sec + interval.tv_sec; - let delta_nsec = base.tv_nsec + interval.tv_nsec; + let Some(delta_sec) = base.tv_sec.checked_add(interval.tv_sec) else { + return None; + }; + let Some(delta_nsec) = base.tv_nsec.checked_add(interval.tv_nsec) else { + return None; + }; if delta_sec < 0 || delta_nsec < 0 { return None; } Some(Self { - tv_sec: delta_sec + (delta_nsec / NANOSECONDS), + tv_sec: delta_sec + (delta_nsec / NANOSECONDS) as time_t, tv_nsec: delta_nsec % NANOSECONDS, }) } /// similar logic with timersub pub fn subtract(later: timespec, earlier: timespec) -> Option { - let delta_sec = later.tv_sec - earlier.tv_sec; - let delta_nsec = later.tv_nsec - earlier.tv_nsec; + let Some(delta_sec) = later.tv_sec.checked_sub(earlier.tv_sec) else { + return None; + }; + let Some(delta_nsec) = later.tv_nsec.checked_sub(earlier.tv_nsec) else { + return None; + }; let time = if delta_nsec < 0 { let roundup_sec = -delta_nsec / NANOSECONDS + 1; timespec { - tv_sec: delta_sec - roundup_sec, + tv_sec: delta_sec - (roundup_sec as time_t), tv_nsec: roundup_sec * NANOSECONDS - delta_nsec, } } else { timespec { - tv_sec: delta_sec + (delta_nsec / NANOSECONDS), + tv_sec: delta_sec + (delta_nsec / NANOSECONDS) as time_t, tv_nsec: delta_nsec % NANOSECONDS, } };