Clamp std::time::Duration before converting to prevent panic

This commit is contained in:
Paul Dicker 2023-09-25 16:33:53 +02:00 committed by Paul Dicker
parent f0c62b4494
commit 483da3b834

View File

@ -1165,18 +1165,19 @@ impl Add<Duration> for NaiveTime {
#[inline] #[inline]
fn add(self, rhs: Duration) -> NaiveTime { fn add(self, rhs: Duration) -> NaiveTime {
let rhs = OldDuration::from_std(rhs) // We don't care about values beyond `24 * 60 * 60`, so we can take a modulus and avoid
.expect("overflow converting from core::time::Duration to chrono::Duration"); // overflow during the conversion to `chrono::Duration`.
self.overflowing_add_signed(rhs).0 // But we limit to double that just in case `self` is a leap-second.
let secs = rhs.as_secs() % (2 * 24 * 60 * 60);
let d = OldDuration::from_std(Duration::new(secs, rhs.subsec_nanos())).unwrap();
self.overflowing_add_signed(d).0
} }
} }
impl AddAssign<Duration> for NaiveTime { impl AddAssign<Duration> for NaiveTime {
#[inline] #[inline]
fn add_assign(&mut self, rhs: Duration) { fn add_assign(&mut self, rhs: Duration) {
let rhs = OldDuration::from_std(rhs) *self = *self + rhs;
.expect("overflow converting from core::time::Duration to chrono::Duration");
*self += rhs;
} }
} }
@ -1256,18 +1257,19 @@ impl Sub<Duration> for NaiveTime {
#[inline] #[inline]
fn sub(self, rhs: Duration) -> NaiveTime { fn sub(self, rhs: Duration) -> NaiveTime {
let rhs = OldDuration::from_std(rhs) // We don't care about values beyond `24 * 60 * 60`, so we can take a modulus and avoid
.expect("overflow converting from core::time::Duration to chrono::Duration"); // overflow during the conversion to `chrono::Duration`.
self.overflowing_sub_signed(rhs).0 // But we limit to double that just in case `self` is a leap-second.
let secs = rhs.as_secs() % (2 * 24 * 60 * 60);
let d = OldDuration::from_std(Duration::new(secs, rhs.subsec_nanos())).unwrap();
self.overflowing_sub_signed(d).0
} }
} }
impl SubAssign<Duration> for NaiveTime { impl SubAssign<Duration> for NaiveTime {
#[inline] #[inline]
fn sub_assign(&mut self, rhs: Duration) { fn sub_assign(&mut self, rhs: Duration) {
let rhs = OldDuration::from_std(rhs) *self = *self - rhs;
.expect("overflow converting from core::time::Duration to chrono::Duration");
*self -= rhs;
} }
} }