From 14c3a12554fa8b5c46b3905162bd9f09695f6dc3 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Tue, 20 Oct 2020 15:42:39 +0200 Subject: openpgp: Pop the armor filter off the stack after parsing. --- openpgp/src/armor.rs | 13 +++++++------ openpgp/src/parse.rs | 6 +++++- openpgp/src/parse/packet_parser_builder.rs | 5 ++++- 3 files changed, 16 insertions(+), 8 deletions(-) (limited to 'openpgp') diff --git a/openpgp/src/armor.rs b/openpgp/src/armor.rs index beab191a..a09b6769 100644 --- a/openpgp/src/armor.rs +++ b/openpgp/src/armor.rs @@ -549,7 +549,7 @@ impl<'a> Reader<'a> { Self::from_buffered_reader( Box::new(buffered_reader::Generic::with_cookie(inner, None, Default::default())), - mode) + mode, Default::default()) } /// Creates a `Reader` from an `io::Read`er. @@ -560,7 +560,7 @@ impl<'a> Reader<'a> { Self::from_buffered_reader( Box::new(buffered_reader::Generic::with_cookie(reader, None, Default::default())), - mode) + mode, Default::default()) } /// Creates a `Reader` from a file. @@ -571,7 +571,7 @@ impl<'a> Reader<'a> { Ok(Self::from_buffered_reader( Box::new(buffered_reader::File::with_cookie(path, Default::default())?), - mode)) + mode, Default::default())) } /// Creates a `Reader` from a buffer. @@ -581,11 +581,12 @@ impl<'a> Reader<'a> { Self::from_buffered_reader( Box::new(buffered_reader::Memory::with_cookie(bytes, Default::default())), - mode) + mode, Default::default()) } pub(crate) fn from_buffered_reader( - inner: Box + 'a>, mode: M) -> Self + inner: Box + 'a>, mode: M, cookie: Cookie) + -> Self where M: Into> { let mode = mode.into().unwrap_or(Default::default()); @@ -607,7 +608,7 @@ impl<'a> Reader<'a> { Reader { reader: buffered_reader::Generic::with_cookie(io_reader, None, - Default::default()), + cookie), } } diff --git a/openpgp/src/parse.rs b/openpgp/src/parse.rs index 7fe4c05b..f3ba9be6 100644 --- a/openpgp/src/parse.rs +++ b/openpgp/src/parse.rs @@ -967,7 +967,8 @@ fn buffered_reader_stack_pop<'a>( let mut last_level = None; while let Some(level) = reader.cookie_ref().level { - assert!(level <= depth); + assert!(level <= depth // Peel off exactly one level. + || depth < 0); // Except for the topmost filters. if level >= depth { let fake_eof = reader.cookie_ref().fake_eof; @@ -4466,6 +4467,9 @@ impl <'a> PacketParser<'a> { if ! fake_eof && recursion_depth == 0 { t!("Popped top-level container, done reading message."); + // Pop topmost filters (e.g. the armor::Reader). + let (_, reader_) = buffered_reader_stack_pop( + reader_, -2)?; let mut eof = PacketParserEOF::new(state_, reader_); eof.last_path = self.last_path; return Ok((self.packet, diff --git a/openpgp/src/parse/packet_parser_builder.rs b/openpgp/src/parse/packet_parser_builder.rs index ae180524..a3a14e22 100644 --- a/openpgp/src/parse/packet_parser_builder.rs +++ b/openpgp/src/parse/packet_parser_builder.rs @@ -415,8 +415,11 @@ impl<'a> PacketParserBuilder<'a> { }; if let Some(mode) = dearmor_mode { + // Add a top-level filter so that it is peeled off when + // the packet parser is finished. We use level -2 for that. self.bio = - armor::Reader::from_buffered_reader(self.bio, Some(mode)) + armor::Reader::from_buffered_reader(self.bio, Some(mode), + Cookie::new(-2)) .as_boxed(); } -- cgit v1.2.3