From 20cf5959cfd1590ad3cb4c80a09f89f19b1a06a5 Mon Sep 17 00:00:00 2001 From: Hendrik Sollich Date: Wed, 22 Jun 2016 23:57:24 +0200 Subject: [PATCH] Fix logic error that caused infinite loop --- parser/src/scanner.rs | 8 ++++---- parser/src/yaml.rs | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/parser/src/scanner.rs b/parser/src/scanner.rs index 058a050..e7a5290 100644 --- a/parser/src/scanner.rs +++ b/parser/src/scanner.rs @@ -1191,12 +1191,12 @@ impl> Scanner { self.lookahead(4); if self.mark.col == 0 && - ((self.buffer[0] == '-') && + (((self.buffer[0] == '-') && (self.buffer[1] == '-') && (self.buffer[2] == '-')) || ((self.buffer[0] == '.') && (self.buffer[1] == '.') && - (self.buffer[2] == '.')) && + (self.buffer[2] == '.'))) && is_blankz(self.buffer[3]) { return Err(ScanError::new(start_mark, "while scanning a quoted scalar, found unexpected document indicator")); @@ -1381,12 +1381,12 @@ impl> Scanner { self.lookahead(4); if self.mark.col == 0 && - ((self.buffer[0] == '-') && + (((self.buffer[0] == '-') && (self.buffer[1] == '-') && (self.buffer[2] == '-')) || ((self.buffer[0] == '.') && (self.buffer[1] == '.') && - (self.buffer[2] == '.')) && + (self.buffer[2] == '.'))) && is_blankz(self.buffer[3]) { break; } diff --git a/parser/src/yaml.rs b/parser/src/yaml.rs index 15aea91..f843491 100644 --- a/parser/src/yaml.rs +++ b/parser/src/yaml.rs @@ -476,4 +476,12 @@ a1: &DEFAULT let s = "{-"; assert!(YamlLoader::load_from_str(&s).is_err()); } + + #[test] + fn test_bad_docstart() { + assert!(YamlLoader::load_from_str("---This used to cause an infinite loop").is_ok()); + assert_eq!(YamlLoader::load_from_str("----"), Ok(vec![Yaml::String(String::from("----"))])); + assert_eq!(YamlLoader::load_from_str("--- #here goes a comment"), Ok(vec![Yaml::Null])); + assert_eq!(YamlLoader::load_from_str("---- #here goes a comment"), Ok(vec![Yaml::String(String::from("----"))])); + } }