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/06/11 09:34:42 UTC

svn commit: r1901822 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser: BruteForceParser.java COSParser.java

Author: lehmi
Date: Sat Jun 11 09:34:41 2022
New Revision: 1901822

URL: http://svn.apache.org/viewvc?rev=1901822&view=rev
Log:
PDFBOX-5452: move the trigger for the brute force search for objects from the constructor to the getter to avoid searches which are not necessary and maybe potentially problematic

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BruteForceParser.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BruteForceParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BruteForceParser.java?rev=1901822&r1=1901821&r2=1901822&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BruteForceParser.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BruteForceParser.java Sat Jun 11 09:34:41 2022
@@ -75,6 +75,8 @@ public class BruteForceParser extends CO
      */
     private final Map<COSObjectKey, Long> bfSearchCOSObjectKeyOffsets = new HashMap<>();
 
+    private boolean bfSearchTriggered = false;
+
     /**
      * Constructor. Triggers a brute force search for all objects of the document.
      *
@@ -86,16 +88,33 @@ public class BruteForceParser extends CO
     {
         super(source);
         this.document = document;
-        bfSearchForObjects();
+    }
+
+    /**
+     * Indicates wether the brute force search for objects was triggered.
+     * 
+     * @return true if the search was triggered
+     */
+    public boolean bfSearchTriggered()
+    {
+        return bfSearchTriggered;
     }
 
     /**
      * Returns all found objects of a brute force search.
      * 
      * @return map containing all found objects of a brute force search
+     * 
+     * @throws IOException if something went wrong
+     * 
      */
-    protected Map<COSObjectKey, Long> getBFCOSObjectOffsets()
+    protected Map<COSObjectKey, Long> getBFCOSObjectOffsets() throws IOException
     {
+        if (!bfSearchTriggered)
+        {
+            bfSearchTriggered = true;
+            bfSearchForObjects();
+        }
         return bfSearchCOSObjectKeyOffsets;
     }
 
@@ -284,16 +303,17 @@ public class BruteForceParser extends CO
         long originOffset = source.getPosition();
 
         Map<Long, COSObjectKey> bfSearchForObjStreamOffsets = bfSearchForObjStreamOffsets();
+        Map<COSObjectKey, Long> bfCOSObjectOffsets = getBFCOSObjectOffsets();
         // log warning about skipped stream
         bfSearchForObjStreamOffsets.entrySet().stream() //
-                .filter(o -> bfSearchCOSObjectKeyOffsets.get(o.getValue()) == null) //
+                .filter(o -> bfCOSObjectOffsets.get(o.getValue()) == null) //
                 .forEach(o -> LOG.warn(
                         "Skipped incomplete object stream:" + o.getValue() + " at " + o.getKey()));
 
         // collect all stream offsets
         List<Long> objStreamOffsets = bfSearchForObjStreamOffsets.entrySet().stream() //
-                .filter(o -> bfSearchCOSObjectKeyOffsets.get(o.getValue()) != null) //
-                .filter(o -> o.getKey().equals(bfSearchCOSObjectKeyOffsets.get(o.getValue()))) //
+                .filter(o -> bfCOSObjectOffsets.get(o.getValue()) != null) //
+                .filter(o -> o.getKey().equals(bfCOSObjectOffsets.get(o.getValue()))) //
                 .map(Map.Entry::getKey) //
                 .collect(Collectors.toList());
         // add all found compressed objects to the brute force search result
@@ -318,16 +338,16 @@ public class BruteForceParser extends CO
                 for (Long objNumber : objectNumbers.keySet())
                 {
                     COSObjectKey objKey = new COSObjectKey(objNumber, 0);
-                    Long existingOffset = bfSearchCOSObjectKeyOffsets.get(objKey);
+                    Long existingOffset = bfCOSObjectOffsets.get(objKey);
                     if (existingOffset != null && existingOffset < 0)
                     {
                         // translate stream object key to its offset
                         COSObjectKey objStmKey = new COSObjectKey(Math.abs(existingOffset), 0);
-                        existingOffset = bfSearchCOSObjectKeyOffsets.get(objStmKey);
+                        existingOffset = bfCOSObjectOffsets.get(objStmKey);
                     }
                     if (existingOffset == null || offset > existingOffset)
                     {
-                        bfSearchCOSObjectKeyOffsets.put(objKey, -stmObjNumber);
+                        bfCOSObjectOffsets.put(objKey, -stmObjNumber);
                         xrefOffset.put(objKey, -stmObjNumber);
                     }
                 }
@@ -431,12 +451,14 @@ public class BruteForceParser extends CO
      *
      * @param trailer dictionary to be used as trailer dictionary
      * @return true if the root was found, false if not.
+     * 
+     * @throws IOException if something went wrong
      */
-    private boolean searchForTrailerItems(COSDictionary trailer)
+    private boolean searchForTrailerItems(COSDictionary trailer) throws IOException
     {
         COSObject rootObject = null;
         COSObject infoObject = null;
-        for (Entry<COSObjectKey, Long> entrySet : bfSearchCOSObjectKeyOffsets.entrySet())
+        for (Entry<COSObjectKey, Long> entrySet : getBFCOSObjectOffsets().entrySet())
         {
             COSObjectKey currentKey = entrySet.getKey();
             COSObject cosObject = document.getObjectFromPool(currentKey);
@@ -807,7 +829,7 @@ public class BruteForceParser extends CO
         trailerResolver.reset();
         // use the found objects to rebuild the trailer resolver
         trailerResolver.nextXrefObj(0, XRefType.TABLE);
-        bfSearchCOSObjectKeyOffsets.forEach(trailerResolver::setXRef);
+        getBFCOSObjectOffsets().forEach(trailerResolver::setXRef);
         trailerResolver.setStartxref(0);
         COSDictionary trailer = trailerResolver.getTrailer();
         document.setTrailer(trailer);

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java?rev=1901822&r1=1901821&r2=1901822&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java Sat Jun 11 09:34:41 2022
@@ -123,7 +123,6 @@ public class COSParser extends BaseParse
     private boolean trailerWasRebuild = false;
     
     private BruteForceParser bruteForceParser = null;
-    private boolean bruteForceSearchSuccessful = false;
     private PDEncryption encryption = null;
     
     /**
@@ -160,6 +159,8 @@ public class COSParser extends BaseParse
      * Default constructor.
      *
      * @param source input representing the pdf.
+     * 
+     * @throws IOException if something went wrong
      */
     public COSParser(RandomAccessRead source) throws IOException
     {
@@ -265,7 +266,8 @@ public class COSParser extends BaseParse
         {
             // prepare decryption if necessary
             prepareDecryption();
-            if (bruteForceSearchSuccessful)
+            // don't use the getter as it creates an instance of BruteForceParser
+            if (bruteForceParser != null && bruteForceParser.bfSearchTriggered())
             {
                 getBruteForceParser().bfSearchForObjStreams(xrefTrailerResolver, securityHandler);
             }
@@ -1338,8 +1340,7 @@ public class COSParser extends BaseParse
     	if (bruteForceParser == null)
     	{
     		bruteForceParser = new BruteForceParser(source, document);
-    		bruteForceSearchSuccessful = !bruteForceParser.getBFCOSObjectOffsets().isEmpty();
-    	}
+        }
     	return bruteForceParser;
     }