diff --git a/src/lib/parser/pipelines/collector.rs b/src/lib/parser/pipelines/collector.rs index 076d07c98360c12cefe2e56388fa23d437d37524..b8259ce238d5c9dce18250e87c5216fdb4616d99 100644 --- a/src/lib/parser/pipelines/collector.rs +++ b/src/lib/parser/pipelines/collector.rs @@ -239,12 +239,14 @@ impl<'a> Collector<'a> { array_brace_counter = array_brace_counter.wrapping_mul(2) + 1; bytes.next(); } - b']' => if array_brace_counter % 2 == 1 { + b']' => { array_level -= 1; - array_brace_counter = (array_brace_counter - 1) / 2; - bytes.next(); - } else { - break; + if array_brace_counter % 2 == 1 { + array_brace_counter = (array_brace_counter - 1) / 2; + bytes.next(); + } else { + break; + } } b'{' => { brace_level += 1; @@ -320,6 +322,9 @@ impl<'a> Collector<'a> { if array_level < 0 { return Err("ion: syntax error: extra right bracket(s)"); } + if brace_level < 0 { + return Err("ion: syntax error: extra right brace(s)"); + } match (start, end) { (Some(i), Some(j)) if i < j => Ok(Some(&self.data[i..j])), (Some(i), None) => Ok(Some(&self.data[i..])), @@ -982,15 +987,21 @@ mod tests { assert_eq!(parse(input), Statement::Pipeline(expected)); } + fn assert_parse_error(s: &str) { + assert!(super::Collector::new(s).parse().is_err()); + } + #[test] fn arrays_braces_out_of_order() { - let unmatched = Err("ion: syntax error: unmatched left bracket"); - - let pipe1 = super::Collector::new("echo {[}]"); - assert_eq!(pipe1.parse(), unmatched); + assert_parse_error("echo {[}]"); + assert_parse_error("echo [{]}"); + } - let pipe2 = super::Collector::new("echo [{]}"); - assert_eq!(pipe2.parse(), unmatched); + #[test] + fn unmatched_right_brackets() { + assert_parse_error("]"); + assert_parse_error("}"); + assert_parse_error(")"); } }