Skip to content

Commit 306d914

Browse files
authored
Fix Duration out of bounds crash (#667)
1 parent 3585bd2 commit 306d914

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

src/builtins/core/duration.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,9 +1549,10 @@ pub(crate) fn is_valid_duration(
15491549
+ minutes as i128 * 60_000_000_000
15501550
+ seconds as i128 * 1_000_000_000;
15511551
// Subseconds part
1552-
let normalized_subseconds_parts = (milliseconds as i128).saturating_mul(1_000_000)
1553-
+ microseconds.saturating_mul(1_000)
1554-
+ nanoseconds;
1552+
let normalized_subseconds_parts = (milliseconds as i128)
1553+
.saturating_mul(1_000_000)
1554+
.saturating_add(microseconds.saturating_mul(1_000))
1555+
.saturating_add(nanoseconds);
15551556

15561557
let total_normalized_seconds =
15571558
normalized_nanoseconds.saturating_add(normalized_subseconds_parts);

src/builtins/core/duration/tests.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,3 +596,12 @@ fn zero_duration() {
596596

597597
assert_eq!(result, Duration::default(), "Duration's must be zero");
598598
}
599+
600+
// https://issues.chromium.org/issues/474201847
601+
#[test]
602+
fn out_of_bounds_duration_no_crash() {
603+
let large = 9223372036854775807 * 9223372036854775807;
604+
let duration = Duration::new(0, 0, 0, 0, 0, 0, 0, 0, large, large);
605+
606+
assert!(duration.is_err());
607+
}

0 commit comments

Comments
 (0)