This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-compress.git
commit a99ff6983d2d75736337d69cbf8f7f51b16681ef Author: Gary D. Gregory <garydgreg...@gmail.com> AuthorDate: Wed Aug 27 15:36:39 2025 -0400 Better allocation check --- .../commons/compress/archivers/sevenz/SevenZFile.java | 2 +- .../compress/archivers/sevenz/SubStreamsInfo.java | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) 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 79f24d4bd..e458eb2eb 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 @@ -359,7 +359,7 @@ public static Builder builder() { return new Builder(); } - private static long bytesToKiB(final long bytes) { + static long bytesToKiB(final long bytes) { return bytes / 1024; } diff --git a/src/main/java/org/apache/commons/compress/archivers/sevenz/SubStreamsInfo.java b/src/main/java/org/apache/commons/compress/archivers/sevenz/SubStreamsInfo.java index bd3546d4f..e1c810507 100644 --- a/src/main/java/org/apache/commons/compress/archivers/sevenz/SubStreamsInfo.java +++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/SubStreamsInfo.java @@ -20,6 +20,7 @@ import java.util.BitSet; +import org.apache.commons.compress.CompressException; import org.apache.commons.compress.MemoryLimitException; /** @@ -42,11 +43,23 @@ final class SubStreamsInfo { */ final long[] crcs; - SubStreamsInfo(final long totalUnpackStreams, final int maxMemoryLimitKiB) throws MemoryLimitException { + SubStreamsInfo(final long totalUnpackStreams, final int maxMemoryLimitKiB) throws CompressException { final int intExactCount = Math.toIntExact(totalUnpackStreams); - MemoryLimitException.checkKiB(SevenZFile.kbToKiB(Math.multiplyExact(intExactCount, 3L)), maxMemoryLimitKiB); - this.unpackSizes = new long[intExactCount]; + int alloc; + try { + // 2 long arrays, just count the longs + alloc = Math.multiplyExact(intExactCount, Long.BYTES * 2); + // one BitSet [boolean, long[], int]. just count the long array + final int sizeOfBitSet = Math.multiplyExact(Long.BYTES, ((intExactCount - 1) >> 6) + 1); + alloc = Math.addExact(alloc, Math.multiplyExact(intExactCount, sizeOfBitSet)); + // check + } catch (ArithmeticException e) { + throw new CompressException("Cannot create allocation request for a SubStreamsInfo of totalUnpackStreams %,d, maxMemoryLimitKiB %,d: %s", + totalUnpackStreams, maxMemoryLimitKiB, e); + } + MemoryLimitException.checkKiB(SevenZFile.bytesToKiB(alloc), maxMemoryLimitKiB); this.hasCrc = new BitSet(intExactCount); this.crcs = new long[intExactCount]; + this.unpackSizes = new long[intExactCount]; } }