Skip to content

Commit 1a360b0

Browse files
authored
Merge pull request #1324 from puneetdixit200/reject-non-string-enum-keys
Reject non-string enum object keys
2 parents 5d30df6 + 2037b63 commit 1a360b0

2 files changed

Lines changed: 40 additions & 1 deletion

File tree

src/de.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2052,7 +2052,17 @@ impl<'de, 'a, R: Read<'de> + 'a> de::EnumAccess<'de> for VariantAccess<'a, R> {
20522052
where
20532053
V: de::DeserializeSeed<'de>,
20542054
{
2055-
let val = tri!(seed.deserialize(&mut *self.de));
2055+
match tri!(self.de.parse_whitespace()) {
2056+
Some(b'"') => {}
2057+
Some(b'}') => return Err(self.de.peek_error(ErrorCode::ExpectedSomeValue)),
2058+
Some(_) => return Err(self.de.peek_error(ErrorCode::KeyMustBeAString)),
2059+
None => return Err(self.de.peek_error(ErrorCode::EofWhileParsingObject)),
2060+
}
2061+
2062+
let val = match seed.deserialize(MapKey { de: &mut *self.de }) {
2063+
Ok(value) => value,
2064+
Err(err) => return Err(self.de.fix_position(err)),
2065+
};
20562066
tri!(self.de.parse_object_colon());
20572067
Ok((val, self))
20582068
}

tests/regression/issue979.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
use serde::de::{Deserializer, EnumAccess, VariantAccess, Visitor};
2+
use std::fmt;
3+
4+
struct EnumVisitor;
5+
6+
impl<'de> Visitor<'de> for EnumVisitor {
7+
type Value = (Vec<bool>, ());
8+
9+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
10+
formatter.write_str("enum")
11+
}
12+
13+
fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
14+
where
15+
A: EnumAccess<'de>,
16+
{
17+
let (key, variant) = data.variant()?;
18+
variant.newtype_variant::<()>()?;
19+
Ok((key, ()))
20+
}
21+
}
22+
23+
#[test]
24+
fn test() {
25+
let mut de = serde_json::Deserializer::from_str("{[true]: null}");
26+
let err = de.deserialize_enum("name", &[], EnumVisitor).unwrap_err();
27+
28+
assert!(err.to_string().contains("key must be a string"));
29+
}

0 commit comments

Comments
 (0)