Author: tilman
Date: Wed Jul 23 07:42:23 2025
New Revision: 1927410
Log:
PDFBOX-6038: catch nested BI, as suggested by David Justamante; add test
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdfparser/PDFStreamParserTest.java
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java
Wed Jul 23 07:42:19 2025 (r1927409)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java
Wed Jul 23 07:42:23 2025 (r1927410)
@@ -48,6 +48,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.
@@ -236,6 +237,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;
@@ -260,6 +267,7 @@ public class PDFStreamParser extends Bas
source.getPosition());
}
beginImageOP.setImageData(imageData.getImageData());
+ inlineImageDepth--;
}
}
return beginImageOP;
Modified:
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdfparser/PDFStreamParserTest.java
==============================================================================
---
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdfparser/PDFStreamParserTest.java
Wed Jul 23 07:42:19 2025 (r1927409)
+++
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdfparser/PDFStreamParserTest.java
Wed Jul 23 07:42:23 2025 (r1927410)
@@ -23,6 +23,7 @@ import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
/**
* Tests for PDFStreamParser.
@@ -89,6 +90,17 @@ class PDFStreamParserTest
testInlineImage2ops("ID\n12EI5EI Q ", "12EI5", "Q");
}
+ /**
+ * PDFBOX-6038: test that nested BI is detected.
+ */
+ @Test
+ void testNestedBI()
+ {
+ IOException ex =
+ assertThrows(IOException.class, () ->
testInlineImage2ops("BI/IB/IB BI/ BI", "", ""));
+ assertEquals("Nested '" + OperatorName.BEGIN_INLINE_IMAGE + "'
operator not allowed", ex.getMessage());
+ }
+
// checks whether there are two operators, one inline image and the named
operator
private void testInlineImage2ops(String s, String imageDataString, String
opName) throws IOException
{