Fix bug #931
authorWerner Koch <wk@gnupg.org>
Thu, 25 Sep 2008 12:55:50 +0000 (12:55 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 25 Sep 2008 12:55:50 +0000 (12:55 +0000)
g10/ChangeLog
g10/parse-packet.c

index 28a6cd9..326e9f2 100644 (file)
@@ -1,5 +1,8 @@
 2008-09-25  Werner Koch  <wk@g10code.com>
 
+       * parse-packet.c (parse): Remove special treatment for compressed
+       new style packets.  Fixes bug#931.
+       
        * card-util.c (change_pin): Support setting of the reset code.
 
 2008-09-24  Werner Koch  <wk@g10code.com>
index dbaa278..a15038d 100644 (file)
@@ -395,12 +395,20 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
            rc = gpg_error (GPG_ERR_INV_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;
@@ -433,19 +441,21 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
               }
              else
               {
-                /* Partial body length.  Note that we handled
-                   PKT_COMPRESSED earlier. */
-                if(pkttype==PKT_PLAINTEXT || pkttype==PKT_ENCRYPTED
-                   || pkttype==PKT_ENCRYPTED_MDC)
-                  {
+                /* 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;/* to indicate partial length */
+                    pktlen = 0;/* To indicate partial length.  */
                     partial=1;
-                  }
-                else
-                  {
+                     break;
+
+                  default:
                     log_error("%s: partial length for invalid"
-                              " packet type %d\n",iobuf_where(inp),pkttype);
+                              " packet type %d\n", iobuf_where(inp),pkttype);
                      rc = gpg_error (GPG_ERR_INV_PACKET);
                     goto leave;
                   }