Robin Schimpf created COMPRESS-510:
--------------------------------------

             Summary: Multiple retrievals of InputStream for same SevenZFile 
entry fails
                 Key: COMPRESS-510
                 URL: https://issues.apache.org/jira/browse/COMPRESS-510
             Project: Commons Compress
          Issue Type: Bug
    Affects Versions: 1.20
            Reporter: Robin Schimpf


I was trying out the new random access for the 7z files and have one of our 
tests failing where we are trying to read the same entry multiple times without 
closing the archive.

Reproducing test case (I added this locally to the SevenZFileTest class)
{code:java}
@Test
public void retrieveInputStreamForEntryMultipleTimes() throws IOException {
    try (SevenZFile sevenZFile = new SevenZFile(getFile("bla.7z"))) {
        for (SevenZArchiveEntry entry : sevenZFile.getEntries()) {
            byte[] firstRead = 
IOUtils.toByteArray(sevenZFile.getInputStream(entry));
            byte[] secondRead = 
IOUtils.toByteArray(sevenZFile.getInputStream(entry));
            assertArrayEquals(firstRead, secondRead);
        }
    }
}
{code}
The Exception thrown is
{code:java}
java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 2   
at 
org.apache.commons.compress.archivers.sevenz.SevenZFile.buildDecodingStream(SevenZFile.java:1183)
        at 
org.apache.commons.compress.archivers.sevenz.SevenZFile.getInputStream(SevenZFile.java:1436)
        at 
org.apache.commons.compress.archivers.sevenz.SevenZFileTest.retrieveInputStreamForEntryMultipleTimes(SevenZFileTest.java:688)
        ...
{code}
A similar test case for e.g. zip works fine
{code:java}
@Test
public void retrieveInputStreamForEntryMultipleTimes() throws IOException {
    try (ZipFile zipFile = new ZipFile(getFile("bla.zip"))) {
        Enumeration<ZipArchiveEntry> entry = zipFile.getEntries();
        while (entry.hasMoreElements()) {
            ZipArchiveEntry e = entry.nextElement();
            byte[] firstRead = IOUtils.toByteArray(zipFile.getInputStream(e));
            byte[] secondRead = IOUtils.toByteArray(zipFile.getInputStream(e));
            assertArrayEquals(firstRead, secondRead);
        }
    }
}
{code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to