This is an automated email from the ASF dual-hosted git repository. peterlee pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-compress.git
The following commit(s) were added to refs/heads/master by this push: new 1e6fd14 COMPRESS-510 : fix multiple retrievals of first entry of 7z 1e6fd14 is described below commit 1e6fd140c081fc50b62c628bec259f2d88417ebf Author: PeterAlfredLee <peteralfred...@gmail.com> AuthorDate: Sat Apr 18 14:54:03 2020 +0800 COMPRESS-510 : fix multiple retrievals of first entry of 7z Multiple retrievals of InputStream for same SevenZFile entry fails --- src/changes/changes.xml | 5 +++++ .../apache/commons/compress/archivers/sevenz/SevenZFile.java | 5 +++-- .../commons/compress/archivers/sevenz/SevenZFileTest.java | 11 +++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 5247a15..90804e8 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -60,6 +60,11 @@ The <action> type attribute can be add,update,fix,remove. of 7z. Github Pull Request #95. </action> + <action issue="COMPRESS-510" type="fix" date="2020-04-18"> + Fix bugs in random access of 7z. Exceptions are thrown + when reading the first entry multiable times by random + access. + </action> </release> <release version="1.20" date="2020-02-08" description="Release 1.20"> diff --git a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java index 2a1d7f9..04a01e8 100644 --- a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java +++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java @@ -1179,8 +1179,9 @@ public class SevenZFile implements Closeable { // previous stream has to be fully decoded before we can start reading // but don't do it eagerly -- if the user skips over the entire folder nothing // is effectively decompressed. - - file.setContentMethods(archive.files[entryIndex - 1].getContentMethods()); + if (entryIndex > 0) { + file.setContentMethods(archive.files[entryIndex - 1].getContentMethods()); + } // if this is called in a random access, then the content methods of previous entry may be null // the content methods should be set to methods of the first entry as it must not be null, diff --git a/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java b/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java index c47904b..68b478c 100644 --- a/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java @@ -673,6 +673,17 @@ public class SevenZFileTest extends AbstractTestCase { } } + @Test + public void retrieveInputStreamForAllEntriesMultipleTimes() 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); + } + } + } + private void test7zUnarchive(final File f, final SevenZMethod m, final byte[] password) throws Exception { try (SevenZFile sevenZFile = new SevenZFile(f, password)) { test7zUnarchive(sevenZFile, m);