[ https://issues.apache.org/jira/browse/COMPRESS-364?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Stefan Bodewig resolved COMPRESS-364. ------------------------------------- Resolution: Fixed Fix Version/s: 1.13 Thanks a lot, Mike, and sorry for the delay. I've applied your patch, it will be part of the next release of compress. > 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 > Fix For: 1.13 > > Attachments: > 0001-COMPRESS-364-ZipArchiveInputStream.closeEntry-fails-.patch > > > 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)