summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@pep.foundation>2021-03-24 15:48:11 +0100
committerNeal H. Walfield <neal@pep.foundation>2021-03-24 15:48:11 +0100
commite20a60fd1a870d1e831cd840cc88d7df926b87b9 (patch)
treed81dbe32cbf69b898b95aa4ab6835e3e528f9101
parentac992b942e57fb68131a72d238c188e30f306941 (diff)
-rw-r--r--openpgp/src/cert/parser/mod.rs24
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");