Skip to content

Commit c450370

Browse files
Manishearthcopybara-github
authored andcommitted
Fix Duration out of bounds crash
Uplifts boa-dev/temporal#667 Bug: 474201847 Change-Id: Id11872df36930b676bf24ad92e0753fd36f1cf6f Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7411376 Commit-Queue: Manish Goregaokar <manishearth@google.com> Auto-Submit: Manish Goregaokar <manishearth@google.com> Commit-Queue: Łukasz Anforowicz <lukasza@chromium.org> Reviewed-by: Łukasz Anforowicz <lukasza@chromium.org> Cr-Commit-Position: refs/heads/main@{#1566400} NOKEYCHECK=True GitOrigin-RevId: 93e7c1c81bfa55e23a8d0b1c758e56a707d723d3
1 parent 8cfe74b commit c450370

3 files changed

Lines changed: 64 additions & 3 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
From c6e04ad5516a829b4c0d99c95d148bbcffb6bd1a Mon Sep 17 00:00:00 2001
2+
From: Manish Goregaokar <manishearth@google.com>
3+
Date: Thu, 8 Jan 2026 16:53:26 +0000
4+
Subject: [PATCH] Fix Duration out of bounds crash
5+
6+
Uplifts https://github.com/boa-dev/temporal/pull/667
7+
8+
Change-Id: Id11872df36930b676bf24ad92e0753fd36f1cf6f
9+
---
10+
.../temporal_rs-v0_1/src/builtins/core/duration.rs | 7 ++++---
11+
.../temporal_rs-v0_1/src/builtins/core/duration/tests.rs | 9 +++++++++
12+
2 files changed, 13 insertions(+), 3 deletions(-)
13+
14+
diff --git a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/duration.rs b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/duration.rs
15+
index 9062e29dc1a01..e613f49763398 100644
16+
--- a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/duration.rs
17+
+++ b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/duration.rs
18+
@@ -1549,9 +1549,10 @@ pub(crate) fn is_valid_duration(
19+
+ minutes as i128 * 60_000_000_000
20+
+ seconds as i128 * 1_000_000_000;
21+
// Subseconds part
22+
- let normalized_subseconds_parts = (milliseconds as i128).saturating_mul(1_000_000)
23+
- + microseconds.saturating_mul(1_000)
24+
- + nanoseconds;
25+
+ let normalized_subseconds_parts = (milliseconds as i128)
26+
+ .saturating_mul(1_000_000)
27+
+ .saturating_add(microseconds.saturating_mul(1_000))
28+
+ .saturating_add(nanoseconds);
29+
30+
let total_normalized_seconds =
31+
normalized_nanoseconds.saturating_add(normalized_subseconds_parts);
32+
diff --git a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/duration/tests.rs b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/duration/tests.rs
33+
index 51c88abb7097d..b7201fbcaf045 100644
34+
--- a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/duration/tests.rs
35+
+++ b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/duration/tests.rs
36+
@@ -578,3 +578,12 @@ fn rounding_window() {
37+
let result = d.round(options, Some(relative_to.into())).unwrap();
38+
assert_eq!(result.years(), 1, "months rounding should no-op");
39+
}
40+
+
41+
+// https://issues.chromium.org/issues/474201847
42+
+#[test]
43+
+fn out_of_bounds_duration_no_crash() {
44+
+ let large = 9223372036854775807 * 9223372036854775807;
45+
+ let duration = Duration::new(0, 0, 0, 0, 0, 0, 0, 0, large, large);
46+
+
47+
+ assert!(duration.is_err());
48+
+}
49+
--
50+
2.52.0.351.gbe84eed79e-goog
51+

chromium_crates_io/vendor/temporal_rs-v0_1/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);

chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/duration/tests.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,3 +578,12 @@ fn rounding_window() {
578578
let result = d.round(options, Some(relative_to.into())).unwrap();
579579
assert_eq!(result.years(), 1, "months rounding should no-op");
580580
}
581+
582+
// https://issues.chromium.org/issues/474201847
583+
#[test]
584+
fn out_of_bounds_duration_no_crash() {
585+
let large = 9223372036854775807 * 9223372036854775807;
586+
let duration = Duration::new(0, 0, 0, 0, 0, 0, 0, 0, large, large);
587+
588+
assert!(duration.is_err());
589+
}

0 commit comments

Comments
 (0)