aboutsummaryrefslogtreecommitdiffstats
path: root/g10/parse-packet.c
diff options
context:
space:
mode:
authorNeal H. Walfield <[email protected]>2015-08-21 09:55:15 +0000
committerNeal H. Walfield <[email protected]>2015-08-21 12:21:13 +0000
commit09f2a7bca624d0492e1d7ab29ce19542249c13ff (patch)
tree16d9f1d0ab6635f21ef8fa13b701e38a48a7cdff /g10/parse-packet.c
parentcommon: Don't assume on-disk layout matches in-memory layout. (diff)
downloadgnupg-09f2a7bca624d0492e1d7ab29ce19542249c13ff.tar.gz
gnupg-09f2a7bca624d0492e1d7ab29ce19542249c13ff.zip
common: Don't incorrectly reject 4 GB - 1 sized packets.
* g10/parse-packet.c (parse): Don't reject 4 GB - 1 sized packets. Add the constraint that the type must be 63. * kbx/keybox-openpgp.c (next_packet): Likewise. * tests/openpgp/4gb-packet.asc: New file. * tests/openpgp/4gb-packet.test: New file. * tests/openpgp/Makefile.am (TESTS): Add 4gb-packet.test. (TEST_FILES): Add 4gb-packet.asc. -- Signed-off-by: Neal H. Walfield <[email protected]>.
Diffstat (limited to 'g10/parse-packet.c')
-rw-r--r--g10/parse-packet.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/g10/parse-packet.c b/g10/parse-packet.c
index bc9965331..edebbe782 100644
--- a/g10/parse-packet.c
+++ b/g10/parse-packet.c
@@ -643,7 +643,14 @@ parse (IOBUF inp, PACKET * pkt, int onlykeypkts, off_t * retpos,
}
}
- if (pktlen == (unsigned long) (-1))
+ /* Sometimes the decompressing layer enters an error state in which
+ it simply outputs 0xff for every byte read. If we have a stream
+ of 0xff bytes, then it will be detected as a new format packet
+ with type 63 and a 4-byte encoded length that is 4G-1. Since
+ packets with type 63 are private and we use them as a control
+ packet, which won't be 4 GB, we reject such packets as
+ invalid. */
+ if (pkttype == 63 && pktlen == 0xFFFFFFFF)
{
/* With some probability this is caused by a problem in the
* the uncompressing layer - in some error cases it just loops