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 2019/02/03 12:10:40 UTC
svn commit: r1852825 - in
/pdfbox/branches/2.0/preflight/src/main/java/org/apache/pdfbox/preflight:
PreflightContext.java utils/ContextHelper.java
Author: tilman
Date: Sun Feb 3 12:10:40 2019
New Revision: 1852825
URL: http://svn.apache.org/viewvc?rev=1852825&view=rev
Log:
PDFBOX-4450: catch more recursions, avoid multiple checking of certain COS elements that isn't caught in recursion check
Modified:
pdfbox/branches/2.0/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightContext.java
pdfbox/branches/2.0/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java
Modified: pdfbox/branches/2.0/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightContext.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightContext.java?rev=1852825&r1=1852824&r2=1852825&view=diff
==============================================================================
--- pdfbox/branches/2.0/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightContext.java (original)
+++ pdfbox/branches/2.0/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightContext.java Sun Feb 3 12:10:40 2019
@@ -23,13 +23,16 @@ package org.apache.pdfbox.preflight;
import java.io.Closeable;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import javax.activation.DataSource;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.pdfparser.XrefTrailerResolver;
+import org.apache.pdfbox.pdmodel.common.COSObjectable;
import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
import org.apache.pdfbox.preflight.font.container.FontContainer;
import org.apache.pdfbox.preflight.graphic.ICCProfileWrapper;
@@ -77,6 +80,8 @@ public class PreflightContext implements
private PreflightPath validationPath = new PreflightPath();
+ private final Set<COSObjectable> processedSet = new HashSet<COSObjectable>();
+
private Integer currentPageNumber = null;
private long fileLen;
@@ -288,4 +293,25 @@ public class PreflightContext implements
{
return fileLen;
}
+
+ /**
+ * Add the argument to the set of processed elements,
+ *
+ * @param cos
+ */
+ public void addToProcessedSet(COSObjectable cos)
+ {
+ processedSet.add(cos);
+ }
+
+ /**
+ * Tell if the argument is in the set of processed elements.
+ *
+ * @param cos
+ * @return true if in the set, false if not.
+ */
+ public boolean isInProcessedSet(COSObjectable cos)
+ {
+ return processedSet.contains(cos);
+ }
}
Modified: pdfbox/branches/2.0/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java?rev=1852825&r1=1852824&r2=1852825&view=diff
==============================================================================
--- pdfbox/branches/2.0/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java (original)
+++ pdfbox/branches/2.0/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java Sun Feb 3 12:10:40 2019
@@ -21,10 +21,13 @@
package org.apache.pdfbox.preflight.utils;
+import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.pdmodel.PDResources;
+import org.apache.pdfbox.pdmodel.common.COSObjectable;
+import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
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 static org.apache.pdfbox.preflight.PreflightConstants.ERROR_PDF_PROCESSING_MISSING;
import org.apache.pdfbox.preflight.PreflightContext;
import org.apache.pdfbox.preflight.PreflightPath;
import org.apache.pdfbox.preflight.exception.ValidationException;
@@ -77,7 +80,22 @@ public final class ContextHelper
{
return;
}
-
+ // avoid checking certain elements twice. This can't be generalized,
+ // because some are checked by several processes.
+ if (element instanceof COSObjectable &&
+ // PDFBOX-4450 catch undetected recursions
+ (PreflightConfiguration.GRAPHIC_PROCESS.equals(processName) ||
+ PreflightConfiguration.FONT_PROCESS.equals(processName))) // for speed
+ {
+ // don't check PDObjects, only their COSObject
+ COSBase cos = ((COSObjectable) element).getCOSObject();
+ if (context.isInProcessedSet(cos))
+ {
+ return;
+ }
+ context.addToProcessedSet(cos);
+ }
+
boolean needPop = validationPath.pushObject(element);
PreflightConfiguration config = context.getConfig();
ValidationProcess process = config.getInstanceOfProcess(processName);
@@ -91,17 +109,18 @@ public final class ContextHelper
// detect recursion that would lead to stack overflow
private static boolean hasRecursion(PreflightContext context, Object element, PreflightPath validationPath)
{
- if (element instanceof PDResources)
+ if (element instanceof PDResources || element instanceof PDFormXObject)
{
for (int i = 0; i < validationPath.size(); ++i)
{
Object obj = validationPath.getPathElement(i, Object.class);
- if (obj instanceof PDResources)
+ if (obj instanceof COSObjectable)
{
- PDResources pdRes = (PDResources) obj;
- if (pdRes.getCOSObject() == ((PDResources) element).getCOSObject())
+ COSObjectable cos = (COSObjectable) obj;
+ if (cos.getCOSObject() == ((COSObjectable) element).getCOSObject())
{
- context.addValidationError(new ValidationError(ERROR_PDF_PROCESSING, "Resources recursion"));
+ context.addValidationError(new ValidationError(ERROR_PDF_PROCESSING,
+ element.getClass().getSimpleName() + " recursion"));
return true;
}
}