diff options
| author | Alan Du <alanhdu@gmail.com> | 2017-05-31 00:30:19 +0100 | 
|---|---|---|
| committer | Alan Du <alanhdu@gmail.com> | 2017-05-31 00:30:58 +0100 | 
| commit | 2a6b365f7c931feb5e870d54c6d4a02e8aee75bf (patch) | |
| tree | 5c7afb340d63606c0630118ffe1ef4d6d2ebba06 | |
| parent | 3322bcd086399a658253e119323f4b4c44aa91ff (diff) | |
| download | milf-rs-2a6b365f7c931feb5e870d54c6d4a02e8aee75bf.tar.gz milf-rs-2a6b365f7c931feb5e870d54c6d4a02e8aee75bf.zip  | |
Error when trying to serialize invalid float
| -rw-r--r-- | src/ser.rs | 17 | ||||
| -rw-r--r-- | tests/invalid-encoder-misc.rs | 14 | 
2 files changed, 29 insertions, 2 deletions
@@ -80,7 +80,7 @@ pub fn to_vec<T: ?Sized>(value: &T) -> Result<Vec<u8>, Error>  ///             enabled: false,  ///         },  ///     }; -///  +///  ///     let toml = toml::to_string(&config).unwrap();  ///     println!("{}", toml)  /// } @@ -122,6 +122,9 @@ pub enum Error {      /// A serialized date was invalid.      DateInvalid, +    /// A serialized number was invalid. +    NumberInvalid, +      /// None was attempted to be serialized, but it's not supported.      UnsupportedNone, @@ -391,6 +394,10 @@ impl<'a, 'b> ser::Serializer for &'b mut Serializer<'a> {      }      fn serialize_f32(mut self, v: f32) -> Result<(), Self::Error> { +        if !v.is_finite() { +            return Err(Error::NumberInvalid); +        } +          self.emit_key("float")?;          drop(write!(self.dst, "{}", v));          if v % 1.0 == 0.0 { @@ -403,6 +410,10 @@ impl<'a, 'b> ser::Serializer for &'b mut Serializer<'a> {      }      fn serialize_f64(mut self, v: f64) -> Result<(), Self::Error> { +        if !v.is_finite() { +            return Err(Error::NumberInvalid); +        } +          self.emit_key("float")?;          drop(write!(self.dst, "{}", v));          if v % 1.0 == 0.0 { @@ -1019,7 +1030,8 @@ impl fmt::Display for Error {              Error::KeyNewline => "map keys cannot contain newlines".fmt(f),              Error::ArrayMixedType => "arrays cannot have mixed types".fmt(f),              Error::ValueAfterTable => "values must be emitted before tables".fmt(f), -            Error::DateInvalid => "a serialize date was invalid".fmt(f), +            Error::DateInvalid => "a serialized date was invalid".fmt(f), +            Error::NumberInvalid => "a serialized number was invalid".fmt(f),              Error::UnsupportedNone => "unsupported None value".fmt(f),              Error::Custom(ref s) => s.fmt(f),              Error::__Nonexhaustive => panic!(), @@ -1036,6 +1048,7 @@ impl error::Error for Error {              Error::ArrayMixedType => "arrays cannot have mixed types",              Error::ValueAfterTable => "values must be emitted before tables",              Error::DateInvalid => "a serialized date was invalid", +            Error::NumberInvalid => "a serialized number was invalid",              Error::UnsupportedNone => "unsupported None value",              Error::Custom(_) => "custom error",              Error::__Nonexhaustive => panic!(), diff --git a/tests/invalid-encoder-misc.rs b/tests/invalid-encoder-misc.rs new file mode 100644 index 0000000..272f58f --- /dev/null +++ b/tests/invalid-encoder-misc.rs @@ -0,0 +1,14 @@ +extern crate toml; + +use std::f64; + +#[test] +fn test_invalid_float_encode() { +    fn bad(value: toml::Value) { +        assert!(toml::to_string(&value).is_err()); +    } + +    bad(toml::Value::Float(f64::INFINITY)); +    bad(toml::Value::Float(f64::NEG_INFINITY)); +    bad(toml::Value::Float(f64::NAN)); +}  |