Fix u128 serialization overflow: reject values exceeding i128::MAX
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();