From dea9398e08c91be683dac5ceb5a404e1e1d04873 Mon Sep 17 00:00:00 2001 From: Jon Gjengset Date: Wed, 18 Jul 2018 16:14:28 -0400 Subject: [PATCH] Don't crash when parsing empty result Partial fix for #81. --- src/parse.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/parse.rs b/src/parse.rs index 3480723..298734b 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -25,9 +25,13 @@ unsafe fn parse_many(lines: Vec, mut map: F) -> ZeroCopyResult> where F: FnMut(Response<'static>) -> MapOrNot, { - let f = |mut lines| { + let f = |mut lines: &'static [u8]| { let mut things = Vec::new(); loop { + if lines.is_empty() { + break Ok(things); + } + match imap_proto::parse_response(lines) { IResult::Done(rest, resp) => { lines = rest; @@ -36,10 +40,6 @@ where MapOrNot::Map(t) => things.push(t), MapOrNot::Not(resp) => break Err(resp.into()), } - - if lines.is_empty() { - break Ok(things); - } } _ => { break Err(Error::Parse(ParseError::Invalid(lines.to_vec()))); @@ -237,6 +237,13 @@ mod tests { assert_eq!(names[0].name(), "INBOX"); } + #[test] + fn parse_fetches_empty() { + let lines = b""; + let fetches = parse_fetches(lines.to_vec()).unwrap(); + assert!(fetches.is_empty()); + } + #[test] fn parse_fetches_test() { let lines = b"\