You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2026/09/15 11:37:32 UTC
svn commit: r1938242 - pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/filter
Author: tilman
Date: Tue Sep 15 11:37:32 2026
New Revision: 1938242
Log:
PDFBOX-6265: protect against extreme decodeParms values
Modified:
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java
Modified: pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java
==============================================================================
--- pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java Tue Sep 15 11:26:07 2026 (r1938241)
+++ pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java Tue Sep 15 11:37:32 2026 (r1938242)
@@ -71,6 +71,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/3.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java
==============================================================================
--- pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java Tue Sep 15 11:26:07 2026 (r1938241)
+++ pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java Tue Sep 15 11:37:32 2026 (r1938242)
@@ -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 = 10_000_000L;
+ 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];