Fix u128 serialization overflow: reject values exceeding i128::MAX
change kwmzrxkxrsxptyxvuyulrlqrzsrznzsl
commit 3cc70e1ba40c7cef32d80b8a55bc8b811d2d7983
author Alpha Chen <alpha@kejadlen.dev>
date
parent pqxqzsvp
diff --git a/src/ser.rs b/src/ser.rs
index b69159e..62c1763 100644
--- a/src/ser.rs
+++ b/src/ser.rs
@@ -256,7 +256,10 @@ impl ser::Serializer for ValueSerializer {
     }
 
     fn serialize_u128(self, v: u128) -> Result<Value> {
-        Ok(Value::Integer(v as i128))
+        let i: i128 = v
+            .try_into()
+            .map_err(|_| Error::IntegerOutOfRange(v as i128))?;
+        Ok(Value::Integer(i))
     }
 
     fn serialize_f32(self, v: f32) -> Result<Value> {
diff --git a/tests/integration.rs b/tests/integration.rs
index 62c1e50..50d6c30 100644
--- a/tests/integration.rs
+++ b/tests/integration.rs
@@ -772,6 +772,13 @@ ser_err!(serialize_top_level_not_struct, 42i32);
 ser_err!(serialize_top_level_string_err, "hello");
 ser_err!(serialize_top_level_bool_err, true);
 
+#[test]
+fn serialize_u128_overflow() {
+    let val = WU128 { value: u128::MAX };
+    let err = serde_kdl2::to_string(&val).unwrap_err();
+    assert!(matches!(err, serde_kdl2::Error::IntegerOutOfRange(_)));
+}
+
 #[test]
 fn serialize_top_level_not_struct_error_type() {
     let err = serde_kdl2::to_string(&42i32).unwrap_err();