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 4246b88 fix COMPRESS-592 4246b88 is described below commit 4246b887ba88dc0b2bc09e92c63fff97381b4a12 Author: PeterAlfredLee <peteralfred...@gmail.com> AuthorDate: Fri Oct 29 18:43:19 2021 +0800 fix COMPRESS-592 fix COMPRESS-592 by using LinkedHashMap --- src/changes/changes.xml | 5 +++++ .../commons/compress/archivers/sevenz/SevenZFile.java | 3 ++- .../compress/archivers/sevenz/SevenZFileTest.java | 17 ++++++++++++++++- src/test/resources/COMPRESS-592.7z | Bin 0 -> 1053510 bytes 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index c19f169..805672d 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -489,6 +489,11 @@ you relied on the recovery attempt."> files containing LZMA streams with end marker. Github Pull Request #223. </action> + <action issue="COMPRESS-592" type="fix" date="2021-10-29" + dev="Peter Lee" due-to="Roland Kreuzer"> + Use LinkedHashMap for fileMap in SevenZFile.readFilesInfo, + as it will be read in specific order. + </action> </release> <release version="1.20" date="2020-02-08" description="Release 1.20 (Java 7)"> 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 9700213..e24ed3f 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 @@ -38,6 +38,7 @@ import java.util.Arrays; import java.util.BitSet; import java.util.EnumSet; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -1367,7 +1368,7 @@ public class SevenZFile implements Closeable { private void readFilesInfo(final ByteBuffer header, final Archive archive) throws IOException { final int numFilesInt = (int) readUint64(header); - final Map<Integer, SevenZArchiveEntry> fileMap = new HashMap<>(); + final Map<Integer, SevenZArchiveEntry> fileMap = new LinkedHashMap<>(); BitSet isEmptyStream = null; BitSet isEmptyFile = null; BitSet isAnti = 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 26aaf35..9e9b717 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 @@ -766,7 +766,22 @@ public class SevenZFileTest extends AbstractTestCase { } } - private void test7zUnarchive(final File f, final SevenZMethod m, final byte[] password) throws Exception { + @Test + public void readBigSevenZipFile() throws IOException { + try (SevenZFile sevenZFile = new SevenZFile(getFile("COMPRESS-592.7z"))) { + SevenZArchiveEntry entry = sevenZFile.getNextEntry(); + while (entry != null) { + if (entry.hasStream()) { + byte[] content = new byte[(int) entry.getSize()]; + sevenZFile.read(content); + } + entry = sevenZFile.getNextEntry(); + } + } + } + + + private void test7zUnarchive(final File f, final SevenZMethod m, final byte[] password) throws Exception { try (SevenZFile sevenZFile = new SevenZFile(f, password)) { test7zUnarchive(sevenZFile, m); } diff --git a/src/test/resources/COMPRESS-592.7z b/src/test/resources/COMPRESS-592.7z new file mode 100644 index 0000000..23f1ccc Binary files /dev/null and b/src/test/resources/COMPRESS-592.7z differ