summaryrefslogtreecommitdiffstats
path: root/openpgp/src/parse.rs
diff options
context:
space:
mode:
Diffstat (limited to 'openpgp/src/parse.rs')
-rw-r--r--openpgp/src/parse.rs27
1 files changed, 25 insertions, 2 deletions
diff --git a/openpgp/src/parse.rs b/openpgp/src/parse.rs
index 968e19b6..61ee0c2a 100644
--- a/openpgp/src/parse.rs
+++ b/openpgp/src/parse.rs
@@ -514,8 +514,10 @@ impl<'a, T: 'a + BufferedReader<Cookie>> PacketHeaderParser<T> {
Box::new(self.reader).into_inner().unwrap()
};
- // We know the data has been read, so this cannot fail.
- reader.data_consume_hard(total_out).unwrap();
+ if total_out > 0 {
+ // We know the data has been read, so this cannot fail.
+ reader.data_consume_hard(total_out).unwrap();
+ }
Ok(PacketParser {
header: self.header,
@@ -6057,4 +6059,25 @@ mod test {
let _ = PacketParser::from_bytes(&data);
Ok(())
}
+
+ /// Tests for a panic in the packet parser.
+ #[test]
+ fn packet_parser_on_mangled_cert() -> Result<()> {
+ // The armored input cert is mangled. Currently, Sequoia
+ // doesn't grok the mangled armor, but it should not panic.
+ let mut ppr = match PacketParser::from_bytes(
+ crate::tests::key("bobs-cert-badly-mangled.asc")) {
+ Ok(ppr) => ppr,
+ Err(_) => return Ok(()),
+ };
+ while let PacketParserResult::Some(pp) = ppr {
+ dbg!(&pp.packet);
+ if let Ok((_, tmp)) = pp.recurse() {
+ ppr = tmp;
+ } else {
+ break;
+ }
+ }
+ Ok(())
+ }
}