Unnamed repository; edit this file 'description' to name the repository.
Check invariant during deserialization
| -rw-r--r-- | lib/text-size/src/serde_impls.rs | 11 | ||||
| -rw-r--r-- | lib/text-size/tests/serde.rs | 22 |
2 files changed, 31 insertions, 2 deletions
diff --git a/lib/text-size/src/serde_impls.rs b/lib/text-size/src/serde_impls.rs index 1963413fd8..617e99cc02 100644 --- a/lib/text-size/src/serde_impls.rs +++ b/lib/text-size/src/serde_impls.rs @@ -1,6 +1,6 @@ use { crate::{TextRange, TextSize}, - serde::{Deserialize, Deserializer, Serialize, Serializer}, + serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer}, }; impl Serialize for TextSize { @@ -35,6 +35,13 @@ impl<'de> Deserialize<'de> for TextRange { where D: Deserializer<'de>, { - Deserialize::deserialize(deserializer).map(|(start, end)| TextRange(start, end)) + let (start, end) = Deserialize::deserialize(deserializer)?; + if !(start <= end) { + return Err(Error::custom(format!( + "invalid range: {:?}..{:?}", + start, end + ))); + } + Ok(TextRange(start, end)) } } diff --git a/lib/text-size/tests/serde.rs b/lib/text-size/tests/serde.rs index 6be1c93815..a32f89e865 100644 --- a/lib/text-size/tests/serde.rs +++ b/lib/text-size/tests/serde.rs @@ -55,3 +55,25 @@ fn range_serialization() { ], ); } + +#[test] +fn invalid_range_deserialization() { + assert_tokens::<TextRange>( + &range(62..92), + &[ + Token::Tuple { len: 2 }, + Token::U32(62), + Token::U32(92), + Token::TupleEnd, + ], + ); + assert_de_tokens_error::<TextRange>( + &[ + Token::Tuple { len: 2 }, + Token::U32(92), + Token::U32(62), + Token::TupleEnd, + ], + "invalid range: 92..62", + ); +} |