This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch misc-hardening__MATH-1691 in repository https://gitbox.apache.org/repos/asf/commons-math.git
commit 9c450d57c36899c2580647d8b45c3c4a594a1889 Author: Gilles Sadowski <[email protected]> AuthorDate: Mon Sep 28 01:02:49 2026 +0200 MATH-1691: Detect invalid dimensions (array size overflow). Found by a security scan. --- .../math4/legacy/field/linalg/FieldDenseMatrix.java | 8 +++++++- .../legacy/field/linalg/FP64FieldDenseMatrixTest.java | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/field/linalg/FieldDenseMatrix.java b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/field/linalg/FieldDenseMatrix.java index 8db234cdf..504605829 100644 --- a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/field/linalg/FieldDenseMatrix.java +++ b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/field/linalg/FieldDenseMatrix.java @@ -31,6 +31,8 @@ import org.apache.commons.math4.legacy.linear.AnyMatrix; */ public final class FieldDenseMatrix<T> implements AnyMatrix { + /** Prevent index aliasing. */ + private static final int MAX_ALLOC_SIZE = Integer.MAX_VALUE - 8; /** Field. */ private final Field<T> field; /** Number of rows. */ @@ -60,11 +62,15 @@ public final class FieldDenseMatrix<T> c <= 0) { throw new IllegalArgumentException("Negative size"); } + final long allocSize = (long) r * (long) c; + if (allocSize > MAX_ALLOC_SIZE) { + throw new IllegalArgumentException("Array too large"); + } field = f; rows = r; columns = c; - data = (T[]) new Object[r * c]; + data = (T[]) new Object[(int) allocSize]; } /** diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/field/linalg/FP64FieldDenseMatrixTest.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/field/linalg/FP64FieldDenseMatrixTest.java index 1af30fa49..339eb24f6 100644 --- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/field/linalg/FP64FieldDenseMatrixTest.java +++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/field/linalg/FP64FieldDenseMatrixTest.java @@ -28,6 +28,20 @@ import org.apache.commons.math4.legacy.linear.Array2DRowRealMatrix; * Tests for {@link FieldDenseMatrix} (using {@link FP64} as field elements). */ public class FP64FieldDenseMatrixTest { + @Test(expected=IllegalArgumentException.class) + public void testTooLargeAllocation() { + final int r = 1 << 16; + final int c = 1 << 15; + FieldDenseMatrix.create(FP64Field.get(), r, c); + } + + @Test + public void testVeryLargeAllocation() { + final int r = 1 << 15; + final int c = 1 << 15; + final FieldDenseMatrix<FP64> a = FieldDenseMatrix.create(FP64Field.get(), r, c); + } + @Test public void testGetRowDimension() { final int r = 6;
