diff options
author | Neal H. Walfield <neal@pep.foundation> | 2021-03-24 15:48:11 +0100 |
---|---|---|
committer | Neal H. Walfield <neal@pep.foundation> | 2021-03-24 15:48:11 +0100 |
commit | e20a60fd1a870d1e831cd840cc88d7df926b87b9 (patch) | |
tree | d81dbe32cbf69b898b95aa4ab6835e3e528f9101 | |
parent | ac992b942e57fb68131a72d238c188e30f306941 (diff) |
-rw-r--r-- | openpgp/src/cert/parser/mod.rs | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/openpgp/src/cert/parser/mod.rs b/openpgp/src/cert/parser/mod.rs index af5f2a38..7fc2c0b5 100644 --- a/openpgp/src/cert/parser/mod.rs +++ b/openpgp/src/cert/parser/mod.rs @@ -507,6 +507,7 @@ impl CertValidator { pub struct CertParser<'a> { source: Option<Box<dyn Iterator<Item=Result<Packet>> + 'a + Send + Sync>>, packets: Vec<Packet>, + queued_error: Option<anyhow::Error>, saw_error: bool, filter: Vec<Box<dyn Send + Sync + Fn(&Cert, bool) -> bool + 'a>>, } @@ -517,6 +518,7 @@ impl<'a> Default for CertParser<'a> { CertParser { source: None, packets: vec![], + queued_error: None, saw_error: false, filter: vec![], } @@ -951,6 +953,9 @@ impl<'a> Iterator for CertParser<'a> { None => { t!("EOF."); + if let Some(err) = self.queued_error.take() { + return Some(Err(err)); + } if self.packets.len() == 0 { return None; } @@ -990,7 +995,24 @@ impl<'a> Iterator for CertParser<'a> { Some(Err(err)) => { t!("Error getting packet: {}", err); self.saw_error = true; - return Some(Err(err)); + + if self.packets.len() > 0 { + // Returned any queued certificate first. + match self.cert(None) { + Ok(Some(cert)) => { + self.queued_error = Some(err); + return Some(Ok(cert)); + } + Ok(None) => { + return Some(Err(err)); + } + Err(err) => { + return Some(Err(err)); + } + } + } else { + return Some(Err(err)); + } } None if self.packets.len() == 0 => { t!("Packet iterator was empty"); |