Michael Mole created COMPRESS-364:
-------------------------------------

             Summary: ZipArchiveInputStream.closeEntry does not properly 
advance to next entry if there are junk bytes at end of data section
                 Key: COMPRESS-364
                 URL: https://issues.apache.org/jira/browse/COMPRESS-364
             Project: Commons Compress
          Issue Type: Bug
          Components: Archivers
    Affects Versions: 1.12
            Reporter: Michael Mole
            Priority: Minor


ZipArchiveInputStream.closeEntry() will not properly advance to the next entry 
causing the next call to getNextZipEntry to incorrectly return null if there 
are junk bytes at the end of the compressed data section.

More specifically, I found a case where the first entry's local header says 
that its compressed data size is 620 bytes. There are in fact 620 bytes before 
the next local header. However, when the compressed data is inflated, it only 
requires 618 of the 620 bytes to fully inflate (i.e. before it encounters the 
DEFLATE end of data code). This means that there is complete DEFLATE compressed 
data + extra garbage bytes after it, all within the specified zip entry data 
section.

The commons compress ZipArchiveInputStream streaming implementation doesn't 
exactly read on zip entry boundaries, but instead it reads 512 bytes at a time. 
As a result it tends to read more bytes than necessary per entry and then seek 
back to the beginning of the next entry. When it seeks back, it assumes that 
number of bytes that were required to be read to reach the end of the zip entry 
is the same as the number of bytes needed to inflate the data. However that 
assumption does not hold up in this case. 620 bytes need to be read to reach 
then end of the zip entry, but only 618 were needed to inflate the data.  After 
the pushback, the closeEntry() method should perform a final drain of the 
remaining bytes to reach the next local file header.

I've created a test case and fix.  I will submit a pull request shortly.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to