summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2020-05-29 13:51:41 +0200
committerJustus Winter <justus@sequoia-pgp.org>2020-05-29 13:51:41 +0200
commitf939eeacad67602fa3236cc5ff64cfe9421f85d0 (patch)
tree5a12445a4394f700a7367eca1b7b627d49ec7fed
parent9ecc55512f4f08130181ab82956a6f19e6bf76a8 (diff)
openpgp: Fix crash due to improper use of buffered reader protocol.
- Fixes #516.
-rw-r--r--openpgp/src/armor.rs28
1 files changed, 27 insertions, 1 deletions
diff --git a/openpgp/src/armor.rs b/openpgp/src/armor.rs
index 09eb92e7..ad475196 100644
--- a/openpgp/src/armor.rs
+++ b/openpgp/src/armor.rs
@@ -1198,7 +1198,7 @@ impl<'a> Read for Reader<'a> {
self.source.consume(consumed);
// Skip any expected prefix
- self.source.consume(self.prefix_len);
+ self.source.data_consume_hard(self.prefix_len)?;
// Look for a footer.
let consumed = {
// Skip whitespace.
@@ -1654,4 +1654,30 @@ mod test {
// `data` is malformed, expect an error.
reader.read_to_end(&mut buf).unwrap_err();
}
+
+ /// Crash in armor parser due to improper use of the buffered
+ /// reader protocol when consuming quoting prefix.
+ #[test]
+ fn issue_516() {
+ let data = [
+ 144, 32, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 125, 13, 125,
+ 125, 93, 125, 125, 93, 125, 13, 13, 125, 125, 45, 45, 45,
+ 45, 45, 66, 69, 71, 73, 78, 32, 80, 71, 80, 32, 77, 69,
+ 83, 83, 65, 71, 69, 45, 45, 45, 45, 45, 125, 13, 125,
+ 125, 93, 125, 125, 93, 125, 13, 13, 125, 125, 45, 0, 0,
+ 0, 0, 0, 0, 0, 0, 125, 205, 21, 1, 21, 21, 21, 1, 1, 1,
+ 1, 21, 149, 21, 21, 21, 21, 32, 4, 141, 141, 141, 141,
+ 202, 74, 11, 125, 8, 21, 50, 50, 194, 48, 147, 93, 174,
+ 23, 23, 23, 23, 23, 23, 147, 147, 147, 23, 23, 23, 23,
+ 23, 23, 48, 125, 125, 93, 125, 13, 125, 125, 125, 93,
+ 125, 125, 13, 13, 125, 125, 13, 13, 93, 125, 13, 125, 45,
+ 125, 125, 45, 45, 66, 69, 71, 73, 78, 32, 80, 71, 45, 45,
+ 125, 10, 45, 45, 0, 0, 10, 45, 45, 210, 10, 0, 0, 87, 0,
+ 0, 0, 150, 10, 0, 0, 241, 87, 45, 0, 0, 121, 121, 10, 10,
+ 21, 58];
+ let mut reader = Reader::from_bytes(&data[..], None);
+ let mut buf = Vec::new();
+ // `data` is malformed, expect an error.
+ reader.read_to_end(&mut buf).unwrap_err();
+ }
}