Author: centic
Date: Mon Apr 11 13:51:31 2022
New Revision: 1899749

URL: http://svn.apache.org/viewvc?rev=1899749&view=rev
Log:
Prevent an overly large allocation when using HPSF

Add a sample document from fuzzing which contains invalid/oversized values

Added:
    poi/trunk/test-data/spreadsheet/poi-fuzz.xls
Modified:
    poi/trunk/poi/src/main/java/org/apache/poi/hpsf/Array.java
    poi/trunk/poi/src/test/java/org/apache/poi/hssf/dev/TestBiffViewer.java
    poi/trunk/test-data/spreadsheet/stress.xls

Modified: poi/trunk/poi/src/main/java/org/apache/poi/hpsf/Array.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/hpsf/Array.java?rev=1899749&r1=1899748&r2=1899749&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/hpsf/Array.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/hpsf/Array.java Mon Apr 11 
13:51:31 2022
@@ -16,12 +16,15 @@
 ==================================================================== */
 package org.apache.poi.hpsf;
 
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.LittleEndianByteArrayInputStream;
 
 @Internal
-public class Array
-{
+public class Array {
+
+    private static final int MAX_NUMBER_OF_ARRAY_SCALARS = 100_000;
+
     static class ArrayDimension {
         private long _size;
         @SuppressWarnings("unused")
@@ -33,8 +36,7 @@ public class Array
         }
     }
 
-    static class ArrayHeader
-    {
+    static class ArrayHeader {
         private ArrayDimension[] _dimensions;
         private int _type;
 
@@ -47,7 +49,7 @@ public class Array
                 String msg = "Array dimension number "+numDimensionsUnsigned+" 
is not in [1; 31] range";
                 throw new IllegalPropertySetDataException(msg);
             }
-                
+
             int numDimensions = (int) numDimensionsUnsigned;
 
             _dimensions = new ArrayDimension[numDimensions];
@@ -86,6 +88,8 @@ public class Array
         }
         int numberOfScalars = (int) numberOfScalarsLong;
 
+        IOUtils.safelyAllocateCheck(numberOfScalars, 
MAX_NUMBER_OF_ARRAY_SCALARS);
+
         _values = new TypedPropertyValue[numberOfScalars];
         int paddedType = (_header._type == Variant.VT_VARIANT) ? 0 : 
_header._type;
         for ( int i = 0; i < numberOfScalars; i++ ) {

Modified: 
poi/trunk/poi/src/test/java/org/apache/poi/hssf/dev/TestBiffViewer.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/hssf/dev/TestBiffViewer.java?rev=1899749&r1=1899748&r2=1899749&view=diff
==============================================================================
--- poi/trunk/poi/src/test/java/org/apache/poi/hssf/dev/TestBiffViewer.java 
(original)
+++ poi/trunk/poi/src/test/java/org/apache/poi/hssf/dev/TestBiffViewer.java Mon 
Apr 11 13:51:31 2022
@@ -40,6 +40,8 @@ class TestBiffViewer extends BaseTestIte
         excludes.put("XRefCalc.xls", RuntimeException.class);
 
         excludes.put("61300.xls", IndexOutOfBoundsException.class);
+        excludes.put("poi-fuzz.xls", RecordFormatException.class);
+
         return excludes;
     }
 

Added: poi/trunk/test-data/spreadsheet/poi-fuzz.xls
URL: 
http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/poi-fuzz.xls?rev=1899749&view=auto
==============================================================================
Binary files poi/trunk/test-data/spreadsheet/poi-fuzz.xls (added) and 
poi/trunk/test-data/spreadsheet/poi-fuzz.xls Mon Apr 11 13:51:31 2022 differ

Modified: poi/trunk/test-data/spreadsheet/stress.xls
URL: 
http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/stress.xls?rev=1899749&r1=1899748&r2=1899749&view=diff
==============================================================================
Binary files - no diff available.



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to