diff options
author | Neal H. Walfield <neal@pep.foundation> | 2022-12-28 15:08:20 +0100 |
---|---|---|
committer | Neal H. Walfield <neal@pep.foundation> | 2023-01-06 13:24:56 +0100 |
commit | 36e0d368773017cafedb430042b29a633b081136 (patch) | |
tree | ca365560c450b63979733f817ed03e80e7b4a9db | |
parent | baabeba261c7403319272d07a680ec1482af5f50 (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.rs | 34 |
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(()) + } } |