From 8bc48e9e616a4194cbbe2271b3ae017711c9cf64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Mon, 5 Oct 2026 12:01:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(=E4=BC=9A=E5=91=98=E8=B4=A6?= =?UTF-8?q?=E6=9C=9F):=20=E5=8C=97=E4=BA=AC=E6=97=B6=E9=97=B4=E5=B9=B4?= =?UTF-8?q?=E4=BB=BD=E8=B6=8A=E7=95=8C=E5=85=88=E6=94=B6=E5=8F=A3=E5=86=8D?= =?UTF-8?q?=E8=BF=9B=E5=8E=86=E6=B3=95=E6=8D=A2=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - beijing_local_micros 增加 ±292_278 年范围检查,避免 days_from_civil 内部 i32 乘法溢出 - 补充 10_000_000 年等溢出用例 --- server-rs/crates/module-runtime/src/membership/cycle.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server-rs/crates/module-runtime/src/membership/cycle.rs b/server-rs/crates/module-runtime/src/membership/cycle.rs index c0ba36070..2a8c39fb2 100644 --- a/server-rs/crates/module-runtime/src/membership/cycle.rs +++ b/server-rs/crates/module-runtime/src/membership/cycle.rs @@ -25,7 +25,10 @@ pub fn beijing_local_date_parts(micros: i64) -> (i32, u8, u8, i64) { /// 返回 `Option` 而不是用 `0` 兼作非法哨兵:北京 1970-01-01 08:00 本身就是合法的 `0`, /// 调用方必须能区分「非法日期」与「合法 epoch」。 pub fn beijing_local_micros(year: i32, month: u8, day: u8, time_of_day_micros: i64) -> Option { - if !(1..=12).contains(&month) + // 中文注释:先按 i64 微秒可表示范围(约 ±292_278 年)收口年份,避免 `days_from_civil` + // 内部的 `era * 146_097` 在 i32 上溢出(debug panic / release 回绕成看似合法的值)。 + if !(-292_278..=292_278).contains(&year) + || !(1..=12).contains(&month) || day == 0 || day > days_in_month(year, month) || !(0..PROFILE_RUNTIME_DAY_MICROS).contains(&time_of_day_micros) @@ -155,6 +158,9 @@ mod tests { // 中文注释:超出 i64 微秒范围的年份必须返回 None,而不是饱和成看似合法的值。 assert_eq!(beijing_local_micros(1_000_000, 1, 1, 0), None); assert_eq!(beijing_local_micros(-1_000_000, 1, 1, 0), None); + // 这些年份会让 days_from_civil 内部的 i32 乘法溢出,必须在进入历法换算前收口。 + assert_eq!(beijing_local_micros(10_000_000, 1, 1, 0), None); + assert_eq!(beijing_local_micros(-10_000_000, 1, 1, 0), None); } #[test]