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)}
*