Author: tilman
Date: Tue Sep 15 11:37:40 2026
New Revision: 1938244

Log:
PDFBOX-6265: protect against extreme decodeParms values

Modified:
   pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java
   
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java   
    Tue Sep 15 11:37:37 2026        (r1938243)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java   
    Tue Sep 15 11:37:40 2026        (r1938244)
@@ -61,6 +61,14 @@ public abstract class Filter
     public static final String SYSPROP_CCITTFAX_MAXBYTES = 
"org.apache.pdfbox.filter.ccittmaxbytes";
 
     /**
+     * PredictorOutputStream max rowLength property, obtained by computing
+     * {@code (columns * colors * bitsPerComponent + 7) / 8}. To raise the cap 
for
+     * high-resolution legitimate documents, use
+     * {@code System.setProperty(Filter.SYSPROP_CCITTFAX_MAXBYTES, 
String.valueOf(10_000_000));}
+     */
+    public static final String SYSPROP_PREDICTOR_MAX_ROW_LENGTH = 
"org.apache.pdfbox.filter.predictormaxrowlength";
+
+    /**
      * Constructor.
      */
     protected Filter()

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java
    Tue Sep 15 11:37:37 2026        (r1938243)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java
    Tue Sep 15 11:37:40 2026        (r1938244)
@@ -289,6 +289,33 @@ public final class Predictor
             {
                 throw new IOException("Calculated row length is negative: " + 
rowLength);
             }
+            // PDFBOX-6265: prevent OOM with extreme values
+            long maxRowLength = 10000000L;
+            String sysProp = 
System.getProperty(Filter.SYSPROP_PREDICTOR_MAX_ROW_LENGTH);
+            if (sysProp != null)
+            {
+                try
+                {
+                    long parsed = Long.parseLong(sysProp);
+                    if (parsed > 0)
+                    {
+                        maxRowLength = parsed;
+                    }
+                    // else ignore zero/negative values
+                }
+                catch (NumberFormatException e)
+                {
+                    // ignore invalid value, keep default
+                }
+            }
+            if (rowLength > maxRowLength)
+            {
+                String msg =
+                        String.format("Calculated row length is too high: %d "
+                                + "(colors: %d, bitsPerComponent: %d, columns: 
%d)",
+                                rowLength, colors, bitsPerComponent, columns);
+                throw new IOException(msg);
+            }
             this.predictorPerRow = predictor >= 10;
             currentRow = new byte[rowLength];
             lastRow = new byte[rowLength];

Reply via email to