diff options
author | Justus Winter <justus@sequoia-pgp.org> | 2020-10-20 15:42:39 +0200 |
---|---|---|
committer | Justus Winter <justus@sequoia-pgp.org> | 2020-10-20 16:09:59 +0200 |
commit | 14c3a12554fa8b5c46b3905162bd9f09695f6dc3 (patch) | |
tree | c1b66dd2fc6e4123b8f721dd5116ad0d5df7ce35 | |
parent | c0e6062d20ecbcba76a342e7f8c7c129fe9286eb (diff) |
openpgp: Pop the armor filter off the stack after parsing.
-rw-r--r-- | openpgp/src/armor.rs | 13 | ||||
-rw-r--r-- | openpgp/src/parse.rs | 6 | ||||
-rw-r--r-- | openpgp/src/parse/packet_parser_builder.rs | 5 |
3 files changed, 16 insertions, 8 deletions
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<M>( - inner: Box<dyn BufferedReader<Cookie> + 'a>, mode: M) -> Self + inner: Box<dyn BufferedReader<Cookie> + 'a>, mode: M, cookie: Cookie) + -> Self where M: Into<Option<ReaderMode>> { 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(); } |