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 2014/11/20 23:20:19 UTC

svn commit: r1640831 - /pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java

Author: tilman
Date: Thu Nov 20 22:20:18 2014
New Revision: 1640831

URL: http://svn.apache.org/r1640831
Log:
PDFBOX-2483: avoid java stack overflow by checking for existing resources in the preflight validation stack

Modified:
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java

Modified: pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java?rev=1640831&r1=1640830&r2=1640831&view=diff
==============================================================================
--- pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java (original)
+++ pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java Thu Nov 20 22:20:18 2014
@@ -21,7 +21,9 @@
 
 package org.apache.pdfbox.preflight.utils;
 
+import org.apache.pdfbox.pdmodel.PDResources;
 import org.apache.pdfbox.preflight.PreflightConfiguration;
+import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_PDF_PROCESSING;
 import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_PDF_PROCESSING_MISSING;
 import org.apache.pdfbox.preflight.PreflightContext;
 import org.apache.pdfbox.preflight.PreflightPath;
@@ -67,6 +69,12 @@ public class ContextHelper
     throws ValidationException
     {
         PreflightPath validationPath = context.getValidationPath();
+
+        if (hasRecursion(context, element, validationPath))
+        {
+            return;
+        }
+        
         boolean needPop = validationPath.pushObject(element);
         PreflightConfiguration config = context.getConfig();
         ValidationProcess process = config.getInstanceOfProcess(processName);
@@ -87,4 +95,27 @@ public class ContextHelper
     {
         callValidation(context, null, processName);
     }
+
+    // detect recursion that would lead to stack overflow
+    private static boolean hasRecursion(PreflightContext context, Object element, PreflightPath validationPath)
+    {
+        if (element instanceof PDResources)
+        {
+            for (int i = 0; i < validationPath.size(); ++i)
+            {
+                Object obj = validationPath.getPathElement(i, Object.class);
+                if (obj instanceof PDResources)
+                {
+                    PDResources pdRes = (PDResources) obj;
+                    if (pdRes.getCOSObject() == ((PDResources) element).getCOSObject())
+                    {
+                        context.addValidationError(new ValidationError(ERROR_PDF_PROCESSING, "Resources recursion"));
+                        return true;
+                    }
+                }               
+            }
+        }
+        return false;
+    }
+
 }