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