Author: tilman
Date: Wed Jul 23 07:42:19 2025
New Revision: 1927409
Log:
PDFBOX-6038: catch nested BI, as suggested by David Justamante; add test
Modified:
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdfparser/PDFStreamParserTest.java
Modified:
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java
==============================================================================
---
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java
Wed Jul 23 06:45:02 2025 (r1927408)
+++
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java
Wed Jul 23 07:42:19 2025 (r1927409)
@@ -52,6 +52,7 @@ public class PDFStreamParser extends Bas
private static final int MAX_BIN_CHAR_TEST_LENGTH = 10;
private final byte[] binCharTestArr = new byte[MAX_BIN_CHAR_TEST_LENGTH];
+ private int inlineImageDepth = 0;
/**
* Constructor.
@@ -275,6 +276,12 @@ public class PDFStreamParser extends Bas
Operator beginImageOP = Operator.getOperator(nextOperator);
if (nextOperator.equals(OperatorName.BEGIN_INLINE_IMAGE))
{
+ inlineImageDepth++;
+ if (inlineImageDepth > 1)
+ {
+ // PDFBOX-6038
+ throw new IOException("Nested '" +
OperatorName.BEGIN_INLINE_IMAGE + "' operator not allowed");
+ }
COSDictionary imageParams = new COSDictionary();
beginImageOP.setImageParameters(imageParams);
Object nextToken = null;
@@ -288,6 +295,7 @@ public class PDFStreamParser extends Bas
break;
}
imageParams.setItem((COSName) nextToken, (COSBase)
value);
+ inlineImageDepth--;
}
// final token will be the image data, maybe??
if (nextToken instanceof Operator)
Modified:
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdfparser/PDFStreamParserTest.java
==============================================================================
---
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdfparser/PDFStreamParserTest.java
Wed Jul 23 06:45:02 2025 (r1927408)
+++
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdfparser/PDFStreamParserTest.java
Wed Jul 23 07:42:19 2025 (r1927409)
@@ -87,6 +87,23 @@ public class PDFStreamParserTest extends
testInlineImage2ops("ID\n12EI5EI Q ", "12EI5", "Q");
}
+ /**
+ * PDFBOX-6038: test that nested BI is detected.
+ */
+ public void testNestedBI()
+ {
+ try
+ {
+ testInlineImage2ops("BI/IB/IB BI/ BI", "", "");
+ }
+ catch (IOException ex)
+ {
+ assertEquals("Nested '" + OperatorName.BEGIN_INLINE_IMAGE + "'
operator not allowed", ex.getMessage());
+ return;
+ }
+ fail("Should have thrown");
+ }
+
// checks whether there are two operators, one inline image and the named
operator
private void testInlineImage2ops(String s, String imageDataString, String
opName) throws IOException
{