summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@pep.foundation>2022-12-28 15:08:20 +0100
committerNeal H. Walfield <neal@pep.foundation>2023-01-06 13:24:56 +0100
commit36e0d368773017cafedb430042b29a633b081136 (patch)
treeca365560c450b63979733f817ed03e80e7b4a9db
parentbaabeba261c7403319272d07a680ec1482af5f50 (diff)
openpgp: When a packet source returns an error, don't assume EOF.
- When a packet source returns an error to `CertParser::next`, don't assume that that means EOF. Subsequent calls may still return packets.
-rw-r--r--openpgp/src/cert/parser/mod.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/openpgp/src/cert/parser/mod.rs b/openpgp/src/cert/parser/mod.rs
index a6174c64..bf4e00f1 100644
--- a/openpgp/src/cert/parser/mod.rs
+++ b/openpgp/src/cert/parser/mod.rs
@@ -998,6 +998,8 @@ impl<'a> Iterator for CertParser<'a> {
self.parse(packet)
}
Some(Err(err)) => {
+ self.source = Some(iter);
+
t!("Error getting packet: {}", err);
if ! self.packets.is_empty() {
@@ -1849,4 +1851,36 @@ mod test {
assert_eq!(certs.len(), 1);
assert!(certs[0].fingerprint() == fp);
}
+
+ #[test]
+ fn packet_source_includes_an_error() -> Result<()> {
+ let mut ppr
+ = PacketParser::from_bytes(crate::tests::key("testy.pgp"))?;
+ let mut testy = Vec::new();
+ while let PacketParserResult::Some(pp) = ppr {
+ let (packet, ppr_) = pp.next()?;
+ testy.push(packet);
+ ppr = ppr_;
+ }
+
+ // A cert, two errors, another cert.
+ let mut packets: Vec<Result<Packet>> = Vec::new();
+ for p in testy.iter() {
+ packets.push(Ok(p.clone()));
+ }
+ packets.push(Err(anyhow::anyhow!("An error")));
+ packets.push(Err(anyhow::anyhow!("Another error")));
+ for p in testy.iter() {
+ packets.push(Ok(p.clone()));
+ }
+
+ let certs = CertParser::from(packets).collect::<Vec<Result<Cert>>>();
+ assert_eq!(certs.len(), 4);
+ assert!(certs[0].is_ok());
+ assert!(certs[1].is_err());
+ assert!(certs[2].is_err());
+ assert!(certs[3].is_ok());
+
+ Ok(())
+ }
}