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;
 		   }
 	       }

Reply via email to