From 66ff2afc4d26e8a491de5d1eb5fbcd01cbf01bb6 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Fri, 23 Oct 2026 16:31:39 +0200 Subject: [PATCH] Return None from parse_number when the value overflows f64 (#3577) Found while testing crates/doc/src/locale_number.rs:104 Co-authored-by: Claude Opus 5.5 --- crates/doc/src/locale_number.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/crates/doc/src/locale_number.rs b/crates/doc/src/locale_number.rs index 569ab0a4b..072b50a2b 100644 --- a/crates/doc/src/locale_number.rs +++ b/crates/doc/src/locale_number.rs @@ -102,6 +102,9 @@ pub fn parse_number(s: &str, lang: Option<&str>) -> Option { return None; } let v: f64 = format!("0{int_digits}.{frac_digits}0").parse().ok()?; + if !v.is_finite() { + return None; + } Some(if neg { -v } else { v }) } @@ -151,6 +154,15 @@ mod tests { assert_eq!(format_number(-0.001, pl), "0,00", "a rounded zero has no sign"); } + #[test] + fn overflowing_digit_strings_are_not_numbers() { + assert_eq!(parse_number(&"1".repeat(350), None), None); + assert_eq!(parse_number(&"9".repeat(400), Some("pl-PL")), None); + assert_eq!(parse_number(&format!("-{}", "1".repeat(350)), None), None); + let big = parse_number(&"1".repeat(300), None); + assert!(big.is_some_and(f64::is_finite), "{big:?}"); + } + #[test] fn cuban_and_peruvian_numbers_use_decimal_points() { for lang in [Some("es-CU"), Some("es-PE")] {