diff --git a/src/read.rs b/src/read.rs index 522c0e011..574857cd8 100644 --- a/src/read.rs +++ b/src/read.rs @@ -587,7 +587,10 @@ impl<'a> Read<'a> for SliceRead<'a> { V: Visitor<'a>, { let raw = &self.slice[self.raw_buffering_start_index..self.index]; - let raw = str::from_utf8(raw).unwrap(); + let raw = match str::from_utf8(raw) { + Ok(raw) => raw, + Err(_) => return error(self, ErrorCode::InvalidUnicodeCodePoint), + }; visitor.visit_map(BorrowedRawDeserializer { raw_value: Some(raw), }) diff --git a/tests/test.rs b/tests/test.rs index ffe58c979..2fe7c560a 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -2201,6 +2201,25 @@ fn test_boxed_raw_value() { assert_eq!(r#"["a",42,{"foo": "bar"},null]"#, array_to_string); } +#[cfg(feature = "raw_value")] +#[test] +fn test_raw_invalid_utf8() { + use serde_json::value::RawValue; + + let j = &[b'"', b'\xCE', b'\xF8', b'"']; + let value_err = serde_json::from_slice::(j).unwrap_err(); + let raw_value_err = serde_json::from_slice::>(j).unwrap_err(); + + assert_eq!( + value_err.to_string(), + "invalid unicode code point at line 1 column 4", + ); + assert_eq!( + raw_value_err.to_string(), + "invalid unicode code point at line 1 column 4", + ); +} + #[test] fn test_borrow_in_map_key() { #[derive(Deserialize, Debug)]