Unnamed repository; edit this file 'description' to name the repository.
Check invariant during deserialization
Aleksey Kladov 2020-03-14
parent 41299f7 · commit bb763ae
-rw-r--r--lib/text-size/src/serde_impls.rs11
-rw-r--r--lib/text-size/tests/serde.rs22
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",
+ );
+}