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 2021/05/02 12:39:27 UTC
svn commit: r1889401 - in
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: cos/COSObjectKey.java
pdfparser/COSParser.java
Author: lehmi
Date: Sun May 2 12:39:26 2021
New Revision: 1889401
URL: http://svn.apache.org/viewvc?rev=1889401&view=rev
Log:
PDFBOX-5151: make generation number final to ensure an immutable hashcode as proposed by Roland Meub
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java?rev=1889401&r1=1889400&r2=1889401&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java Sun May 2 12:39:26 2021
@@ -25,7 +25,7 @@ package org.apache.pdfbox.cos;
public class COSObjectKey implements Comparable<COSObjectKey>
{
private final long number;
- private int generation;
+ private final int generation;
/**
* Constructor.
@@ -72,16 +72,6 @@ public class COSObjectKey implements Com
}
/**
- * This will set the generation number. It is intended for fixes only.
- *
- * @param genNumber the new generation number.
- */
- public void fixGeneration(int genNumber)
- {
- generation = genNumber;
- }
-
- /**
* This will get the objects id.
*
* @return The object's id.
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=1889401&r1=1889400&r2=1889401&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 Sun May 2 12:39:26 2021
@@ -1154,20 +1154,34 @@ public class COSParser extends BaseParse
{
return true;
}
+ Map<COSObjectKey, COSObjectKey> correctedKeys = new HashMap<>();
for (Entry<COSObjectKey, Long> objectEntry : xrefOffset.entrySet())
{
COSObjectKey objectKey = objectEntry.getKey();
Long objectOffset = objectEntry.getValue();
// a negative offset number represents an object number itself
// see type 2 entry in xref stream
- if (objectOffset != null && objectOffset >= 0
- && !checkObjectKey(objectKey, objectOffset))
+ if (objectOffset != null && objectOffset >= 0)
{
- LOG.debug("Stop checking xref offsets as at least one (" + objectKey
- + ") couldn't be dereferenced");
- return false;
+ COSObjectKey foundObjectKey = findObjectKey(objectKey, objectOffset);
+ if (foundObjectKey == null)
+ {
+ LOG.debug("Stop checking xref offsets as at least one (" + objectKey
+ + ") couldn't be dereferenced");
+ return false;
+ }
+ else if (foundObjectKey != objectKey)
+ {
+ // Generation was fixed - need to update map later, after iteration
+ correctedKeys.put(objectKey, foundObjectKey);
+ }
}
}
+ for (Entry<COSObjectKey, COSObjectKey> correctedKeyEntry : correctedKeys.entrySet())
+ {
+ xrefOffset.put(correctedKeyEntry.getValue(),
+ xrefOffset.remove(correctedKeyEntry.getKey()));
+ }
return true;
}
@@ -1204,14 +1218,13 @@ public class COSParser extends BaseParse
* @return returns true if the given object can be dereferenced at the given offset
* @throws IOException if something went wrong
*/
- private boolean checkObjectKey(COSObjectKey objectKey, long offset) throws IOException
+ private COSObjectKey findObjectKey(COSObjectKey objectKey, long offset) throws IOException
{
// there can't be any object at the very beginning of a pdf
if (offset < MINIMUM_SEARCH_OFFSET)
{
- return false;
+ return null;
}
- boolean objectKeyFound = false;
try
{
source.seek(offset);
@@ -1219,18 +1232,15 @@ public class COSParser extends BaseParse
if (objectKey.getNumber() == readObjectNumber())
{
int genNumber = readGenerationNumber();
+ // finally try to read the object marker
+ readExpectedString(OBJ_MARKER, true);
if (genNumber == objectKey.getGeneration())
{
- // finally try to read the object marker
- readExpectedString(OBJ_MARKER, true);
- objectKeyFound = true;
+ return objectKey;
}
else if (isLenient && genNumber > objectKey.getGeneration())
{
- // finally try to read the object marker
- readExpectedString(OBJ_MARKER, true);
- objectKeyFound = true;
- objectKey.fixGeneration(genNumber);
+ return new COSObjectKey(objectKey.getNumber(), genNumber);
}
}
}
@@ -1239,8 +1249,7 @@ public class COSParser extends BaseParse
// Swallow the exception, obviously there isn't any valid object number
LOG.debug("No valid object at given location " + offset + " - ignoring", exception);
}
- // return resulting value
- return objectKeyFound;
+ return null;
}
private Map<COSObjectKey, Long> getBFCOSObjectOffsets() throws IOException