You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2021/05/16 09:04:19 UTC
[commons-compress] branch master updated: COMPRESS-542 and some
final sanity checks
This is an automated email from the ASF dual-hosted git repository.
bodewig 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 0aba8b8 COMPRESS-542 and some final sanity checks
0aba8b8 is described below
commit 0aba8b8fd8053ae323f15d736d1762b2161c76a6
Author: Stefan Bodewig <st...@innoq.com>
AuthorDate: Sun May 16 11:00:49 2021 +0200
COMPRESS-542 and some final sanity checks
---
.../apache/commons/compress/archivers/sevenz/SevenZFile.java | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
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 a08c02a..2d7bb77 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
@@ -41,6 +41,7 @@ import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
import java.util.zip.CRC32;
import org.apache.commons.compress.utils.BoundedInputStream;
@@ -936,7 +937,10 @@ public class SevenZFile implements Closeable {
for (int i = 0; i < stats.numberOfFolders; i++) {
numUnpackSubStreamsPerFolder.add(assertFitsIntoNonNegativeInt("numStreams", readUint64(header)));
}
+ stats.numberOfUnpackSubStreams = numUnpackSubStreamsPerFolder.stream().collect(Collectors.summingLong(Integer::longValue));
nid = getUnsignedByte(header);
+ } else {
+ stats.numberOfUnpackSubStreams = stats.numberOfFolders;
}
if (nid == NID.kSize) {
@@ -952,7 +956,6 @@ public class SevenZFile implements Closeable {
}
sum += size;
}
- // TODO sum < folder.unpackSize
}
nid = getUnsignedByte(header);
}
@@ -1022,6 +1025,9 @@ public class SevenZFile implements Closeable {
sum += size;
}
}
+ if (sum > folder.getUnpackSize()) {
+ throw new IOException("sum of unpack sizes of folder exceeds total unpack size");
+ }
subStreamsInfo.unpackSizes[nextUnpackStream++] = folder.getUnpackSize() - sum;
}
if (nid == NID.kSize) {
@@ -2121,6 +2127,7 @@ public class SevenZFile implements Closeable {
private long numberOfCoders;
private long numberOfOutStreams;
private long numberOfInStreams;
+ private long numberOfUnpackSubStreams;
private int numberOfFolders;
private BitSet folderHasCrc;
private int numberOfEntries;
@@ -2150,6 +2157,9 @@ public class SevenZFile implements Closeable {
if (numberOfEntriesWithStream > 0 && numberOfFolders == 0) {
throw new IOException("archive with entries but no folders");
}
+ if (numberOfEntriesWithStream > numberOfUnpackSubStreams) {
+ throw new IOException("archive doesn't contain enough substreams for entries");
+ }
}
private long folderSize() {