Merge pull request #25 from hoodie/bug/infinite_loop

Fix logic error that caused infinite loop
This commit is contained in:
Chen Yuheng 2016-06-23 12:41:59 +08:00 committed by GitHub
commit a99c7b3a9d
2 changed files with 12 additions and 4 deletions

View file

@ -1191,12 +1191,12 @@ impl<T: Iterator<Item=char>> Scanner<T> {
self.lookahead(4); self.lookahead(4);
if self.mark.col == 0 && if self.mark.col == 0 &&
((self.buffer[0] == '-') && (((self.buffer[0] == '-') &&
(self.buffer[1] == '-') && (self.buffer[1] == '-') &&
(self.buffer[2] == '-')) || (self.buffer[2] == '-')) ||
((self.buffer[0] == '.') && ((self.buffer[0] == '.') &&
(self.buffer[1] == '.') && (self.buffer[1] == '.') &&
(self.buffer[2] == '.')) && (self.buffer[2] == '.'))) &&
is_blankz(self.buffer[3]) { is_blankz(self.buffer[3]) {
return Err(ScanError::new(start_mark, return Err(ScanError::new(start_mark,
"while scanning a quoted scalar, found unexpected document indicator")); "while scanning a quoted scalar, found unexpected document indicator"));
@ -1381,12 +1381,12 @@ impl<T: Iterator<Item=char>> Scanner<T> {
self.lookahead(4); self.lookahead(4);
if self.mark.col == 0 && if self.mark.col == 0 &&
((self.buffer[0] == '-') && (((self.buffer[0] == '-') &&
(self.buffer[1] == '-') && (self.buffer[1] == '-') &&
(self.buffer[2] == '-')) || (self.buffer[2] == '-')) ||
((self.buffer[0] == '.') && ((self.buffer[0] == '.') &&
(self.buffer[1] == '.') && (self.buffer[1] == '.') &&
(self.buffer[2] == '.')) && (self.buffer[2] == '.'))) &&
is_blankz(self.buffer[3]) { is_blankz(self.buffer[3]) {
break; break;
} }

View file

@ -476,4 +476,12 @@ a1: &DEFAULT
let s = "{-"; let s = "{-";
assert!(YamlLoader::load_from_str(&s).is_err()); 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("----"))]));
}
} }