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
     {

Reply via email to