Fixed in upstream revision 4990. Patch attached.
#2009-05-05 Werner Koch <[email protected]>
#
# * parse-packet.c (parse): Remove special treatment for compressed
# new style packets. Fixes bug#931.
#
#
Index: gnupg_1_4/g10/parse-packet.c
===================================================================
--- gnupg_1_4/g10/parse-packet.c (Revision 4989)
+++ gnupg_1_4/g10/parse-packet.c (Revision 4990)
@@ -346,12 +346,19 @@
rc = G10ERR_INVALID_PACKET;
goto leave;
}
- if (pkttype == PKT_COMPRESSED) {
- iobuf_set_partial_block_mode(inp, c & 0xff);
- pktlen = 0;/* to indicate partial length */
- partial=1;
- }
- else {
+/* The follwing code has been here for ages (2002-08-30) but it is
+ clearly wrong: For example passing a 0 as second argument to
+ iobuf_set_partial_block_mode stops the partial block mode which we
+ definitely do not want. Also all values < 224 or 255 are not
+ valid. Let's disable it and put PKT_COMPRESSED into the list of
+ allowed packets with partial header until someone complains. */
+/* if (pkttype == PKT_COMPRESSED) { */
+/* iobuf_set_partial_block_mode(inp, c & 0xff); */
+/* pktlen = 0;/\* to indicate partial length *\/ */
+/* partial=1; */
+/* } */
+/* else { */
+ {
hdr[hdrlen++] = c;
if( c < 192 )
pktlen = c;
@@ -384,20 +391,22 @@
}
else
{
- /* Partial body length. Note that we handled
- PKT_COMPRESSED earlier. */
- if(pkttype==PKT_PLAINTEXT || pkttype==PKT_ENCRYPTED
- || pkttype==PKT_ENCRYPTED_MDC)
- {
- iobuf_set_partial_block_mode(inp, c & 0xff);
- pktlen = 0;/* to indicate partial length */
- partial=1;
- }
- else
- {
- log_error("%s: partial length for invalid"
- " packet type %d\n",iobuf_where(inp),pkttype);
- rc=G10ERR_INVALID_PACKET;
+ /* Partial body length. */
+ switch (pkttype)
+ {
+ case PKT_PLAINTEXT:
+ case PKT_ENCRYPTED:
+ case PKT_ENCRYPTED_MDC:
+ case PKT_COMPRESSED:
+ iobuf_set_partial_block_mode (inp, (c & 0xff));
+ pktlen = 0; /* Indicate partial length. */
+ partial= 1;
+ break;
+
+ default:
+ log_error ("%s: partial length for invalid"
+ " packet type %d\n", iobuf_where(inp),pkttype);
+ rc = G10ERR_INVALID_PACKET;
goto leave;
}
}