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;
}