summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2020-10-20 15:42:39 +0200
committerJustus Winter <justus@sequoia-pgp.org>2020-10-20 16:09:59 +0200
commit14c3a12554fa8b5c46b3905162bd9f09695f6dc3 (patch)
treec1b66dd2fc6e4123b8f721dd5116ad0d5df7ce35
parentc0e6062d20ecbcba76a342e7f8c7c129fe9286eb (diff)
openpgp: Pop the armor filter off the stack after parsing.
-rw-r--r--openpgp/src/armor.rs13
-rw-r--r--openpgp/src/parse.rs6
-rw-r--r--openpgp/src/parse/packet_parser_builder.rs5
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();
}