diff --git a/src/de.rs b/src/de.rs index ad8554b7..f3c71416 100644 --- a/src/de.rs +++ b/src/de.rs @@ -101,17 +101,20 @@ impl<'de> Deserializer<'de> { let mut pos = 0; let mut jumpcount = 0; - match &self.progress { + match self.progress { Progress::Iterable(_) => return Err(error::new(ErrorImpl::MoreThanOneDocument)), Progress::Document(document) => { let t = f(&mut DeserializerFromEvents { - document, + document: &document, pos: &mut pos, jumpcount: &mut jumpcount, path: Path::Root, remaining_depth: 128, current_enum: None, })?; + if let Some(parse_error) = document.error { + return Err(error::shared(parse_error)); + } return Ok(t); } _ => {} @@ -130,6 +133,9 @@ impl<'de> Deserializer<'de> { remaining_depth: 128, current_enum: None, })?; + if let Some(parse_error) = document.error { + return Err(error::shared(parse_error)); + } if loader.next_document().is_none() { Ok(t) } else { diff --git a/src/libyaml/parser.rs b/src/libyaml/parser.rs index 9f43ced7..ae8f3758 100644 --- a/src/libyaml/parser.rs +++ b/src/libyaml/parser.rs @@ -84,6 +84,9 @@ impl<'input> Parser<'input> { let mut event = MaybeUninit::::uninit(); unsafe { let parser = addr_of_mut!((*self.pin.ptr).sys); + if (*parser).error != sys::YAML_NO_ERROR { + return Err(Error::parse_error(parser)); + } let event = event.as_mut_ptr(); if sys::yaml_parser_parse(parser, event).fail { return Err(Error::parse_error(parser)); diff --git a/tests/test_error.rs b/tests/test_error.rs index e070de8e..4f1e576f 100644 --- a/tests/test_error.rs +++ b/tests/test_error.rs @@ -3,7 +3,7 @@ use indoc::indoc; use serde::de::{Deserialize, SeqAccess, Visitor}; use serde_derive::{Deserialize, Serialize}; -use serde_yaml::Deserializer; +use serde_yaml::{Deserializer, Value}; use std::collections::BTreeMap; use std::fmt::{self, Debug}; @@ -15,6 +15,13 @@ where assert_eq!(expected, result.unwrap_err().to_string()); } +#[test] +fn test_scan_error() { + let yaml = ">\n@"; + let expected = "found character that cannot start any token at line 2 column 1, while scanning for the next token"; + test_error::(yaml, expected); +} + #[test] fn test_incorrect_type() { let yaml = indoc! {"