diff options
| author | beetrees <b@beetr.ee> | 2022-10-05 22:27:17 +0100 |
|---|---|---|
| committer | beetrees <b@beetr.ee> | 2022-10-14 15:13:20 +0100 |
| commit | 5def7534e4f86165fd5f984e542c17921dc9fd08 (patch) | |
| tree | af6313250749536ee84d8dc77a820db63fadb062 /library/std/src/sys/unix | |
| parent | 9b0a099dfc9a97ecd10adb319396c731c4b2d169 (diff) | |
| download | rust-5def7534e4f86165fd5f984e542c17921dc9fd08.tar.gz rust-5def7534e4f86165fd5f984e542c17921dc9fd08.zip | |
Fix `checked_{add,sub}_duration` incorrectly returning `None` when `other` has more than `i64::MAX` seconds
Diffstat (limited to 'library/std/src/sys/unix')
| -rw-r--r-- | library/std/src/sys/unix/time.rs | 16 |
1 files changed, 4 insertions, 12 deletions
diff --git a/library/std/src/sys/unix/time.rs b/library/std/src/sys/unix/time.rs index cca9c676701..5cf70110812 100644 --- a/library/std/src/sys/unix/time.rs +++ b/library/std/src/sys/unix/time.rs @@ -102,11 +102,7 @@ impl Timespec { } pub fn checked_add_duration(&self, other: &Duration) -> Option<Timespec> { - let mut secs = other - .as_secs() - .try_into() // <- target type would be `i64` - .ok() - .and_then(|secs| self.tv_sec.checked_add(secs))?; + let mut secs = self.tv_sec.checked_add_unsigned(other.as_secs())?; // Nano calculations can't overflow because nanos are <1B which fit // in a u32. @@ -115,15 +111,11 @@ impl Timespec { nsec -= NSEC_PER_SEC as u32; secs = secs.checked_add(1)?; } - Some(Timespec::new(secs, nsec as i64)) + Some(Timespec::new(secs, nsec.into())) } pub fn checked_sub_duration(&self, other: &Duration) -> Option<Timespec> { - let mut secs = other - .as_secs() - .try_into() // <- target type would be `i64` - .ok() - .and_then(|secs| self.tv_sec.checked_sub(secs))?; + let mut secs = self.tv_sec.checked_sub_unsigned(other.as_secs())?; // Similar to above, nanos can't overflow. let mut nsec = self.tv_nsec.0 as i32 - other.subsec_nanos() as i32; @@ -131,7 +123,7 @@ impl Timespec { nsec += NSEC_PER_SEC as i32; secs = secs.checked_sub(1)?; } - Some(Timespec::new(secs, nsec as i64)) + Some(Timespec::new(secs, nsec.into())) } #[allow(dead_code)] |
