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/19 18:52:02 UTC

svn commit: r1640612 - /pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java

Author: tilman
Date: Wed Nov 19 17:52:02 2014
New Revision: 1640612

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

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

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java?rev=1640612&r1=1640611&r2=1640612&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java Wed Nov 19 17:52:02 2014
@@ -21,8 +21,10 @@
 
 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_MISSING;
+import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_PDF_PROCESSING;
 import org.apache.pdfbox.preflight.PreflightContext;
 import org.apache.pdfbox.preflight.PreflightPath;
 import org.apache.pdfbox.preflight.exception.ValidationException;
@@ -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);
@@ -76,6 +84,28 @@ public class ContextHelper
         }
     }
 
+    // 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;
+    }
+
     /**
      * call directly the {@link #callValidation(PreflightContext, Object, String)}
      *