gpg: Move sqlite helper functions into their own file.
[gnupg.git] / g10 / parse-packet.c
index bc99653..4e236cb 100644 (file)
@@ -558,27 +558,20 @@ parse (IOBUF inp, PACKET * pkt, int onlykeypkts, off_t * retpos,
       else if (c == 255)
         {
          int i;
-         int eof = 0;
          char value[4];
 
          for (i = 0; i < 4; i ++)
-           if ((value[i] = hdr[hdrlen++] = iobuf_get (inp)) == -1)
-             {
-               eof = 1;
-               break;
-             }
-
-         if (eof)
             {
-              log_error ("%s: 4 byte length invalid\n", iobuf_where (inp));
-              rc = gpg_error (GPG_ERR_INV_PACKET);
-              goto leave;
+              if ((c = iobuf_get (inp)) == -1)
+                {
+                  log_error ("%s: 4 byte length invalid\n", iobuf_where (inp));
+                  rc = gpg_error (GPG_ERR_INV_PACKET);
+                  goto leave;
+                }
+              value[i] = hdr[hdrlen++] = c;
             }
 
-         pktlen = (((unsigned long) value[0] << 24)
-                   | ((unsigned long) value[1] << 16)
-                   | ((unsigned long) value[2] << 8)
-                   | ((unsigned long) value[3]));
+         pktlen = buf32_to_ulong (value);
         }
       else /* Partial body length.  */
         {
@@ -643,7 +636,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