Fix logic error that caused infinite loop

This commit is contained in:
Hendrik Sollich 2016-06-22 23:57:24 +02:00
parent fc774f2963
commit ca7956f429
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("----"))]));
}
} }