You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2022/02/08 07:19:31 UTC
svn commit: r1897842 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java
Author: lehmi
Date: Tue Feb 8 07:19:31 2022
New Revision: 1897842
URL: http://svn.apache.org/viewvc?rev=1897842&view=rev
Log:
PDFBOX-5339: avoid recursion and a StackOverflowError, throw an IllegalStateException instead
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java?rev=1897842&r1=1897841&r2=1897842&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java Tue Feb 8 07:19:31 2022
@@ -46,6 +46,8 @@ public class PDPageTree implements COSOb
private final COSDictionary root;
private final PDDocument document; // optional
+ private final Set<COSDictionary> pageSet = new HashSet<>();
+
/**
* Constructor for embedding.
*/
@@ -278,7 +280,18 @@ public class PDPageTree implements COSOb
{
throw new IndexOutOfBoundsException("Index out of bounds: " + pageNum);
}
-
+ if (pageSet.contains(node))
+ {
+ pageSet.clear();
+ throw new IllegalStateException(
+ "Possible recursion found when searching for page " + pageNum);
+ }
+ else
+ {
+ // collect already processed pages to detect possible recursions
+ // to avoid a StackOverflowError
+ pageSet.add(node);
+ }
if (isPageTreeNode(node))
{
int count = node.getInt(COSName.COUNT, 0);
@@ -324,6 +337,7 @@ public class PDPageTree implements COSOb
{
if (encountered == pageNum)
{
+ pageSet.clear();
return node;
}
else