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];
     }
 }

Reply via email to