From 2c183216d3462fb7cf1515cfbe8ec6ea16b6288d Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 29 Jul 2022 03:44:30 -0700 Subject: [PATCH 1/3] Fix unreachable code panic on scan error --- src/libyaml/parser.rs | 3 +++ 1 file changed, 3 insertions(+) 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)); From 37bd40af886293d70a6f7b67c7af6ddeba1c1d8b Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 29 Jul 2022 03:45:27 -0700 Subject: [PATCH 2/3] Add test of scan error --- tests/test_error.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/test_error.rs b/tests/test_error.rs index e070de8e..fb10e00d 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 = "deserializing from YAML containing more than one document is not supported"; + test_error::(yaml, expected); +} + #[test] fn test_incorrect_type() { let yaml = indoc! {" From d23702022da98c49e04413bc1ac0137e86cd0a28 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 29 Jul 2022 03:54:45 -0700 Subject: [PATCH 3/3] Improve error message on scan error --- src/de.rs | 10 ++++++++-- tests/test_error.rs | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) 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/tests/test_error.rs b/tests/test_error.rs index fb10e00d..4f1e576f 100644 --- a/tests/test_error.rs +++ b/tests/test_error.rs @@ -18,7 +18,7 @@ where #[test] fn test_scan_error() { let yaml = ">\n@"; - let expected = "deserializing from YAML containing more than one document is not supported"; + let expected = "found character that cannot start any token at line 2 column 1, while scanning for the next token"; test_error::(yaml, expected); }