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 2017/05/21 14:23:10 UTC

svn commit: r1795704 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java

Author: lehmi
Date: Sun May 21 14:23:10 2017
New Revision: 1795704

URL: http://svn.apache.org/viewvc?rev=1795704&view=rev
Log:
PDFBOX-3798: don't add cut off objects when performing a brute force search

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java?rev=1795704&r1=1795703&r2=1795704&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java Sun May 21 14:23:10 2017
@@ -1440,6 +1440,9 @@ public class COSParser extends BaseParse
             bfSearchCOSObjectKeyOffsets = new HashMap<COSObjectKey, Long>();
             long originOffset = source.getPosition();
             long currentOffset = MINIMUM_SEARCH_OFFSET;
+            long lastObjectId = Long.MIN_VALUE;
+            int lastGenID = Integer.MIN_VALUE;
+            long lastObjOffset = Long.MIN_VALUE;
             String objString = " obj";
             char[] string = objString.toCharArray();
             do
@@ -1471,9 +1474,17 @@ public class COSParser extends BaseParse
                             if (objectIDFound)
                             {
                                 source.read();
-                                long objectID = readObjectNumber();
-                                bfSearchCOSObjectKeyOffsets.put(new COSObjectKey(objectID, genID),
-                                        tempOffset + 1);
+                                long objectId = readObjectNumber();
+                                if (lastObjOffset > 0)
+                                {
+                                    // add the former object ID only if there was a subsequent object ID
+                                    bfSearchCOSObjectKeyOffsets
+                                            .put(new COSObjectKey(lastObjectId, lastGenID),
+                                                    lastObjOffset);
+                                }
+                                lastObjectId = objectId;
+                                lastGenID = genID;
+                                lastObjOffset = tempOffset + 1;
                             }
                         }
                     }
@@ -1481,6 +1492,13 @@ public class COSParser extends BaseParse
                 currentOffset++;
             }
             while (currentOffset < lastEOFMarker && !source.isEOF());
+            if (lastEOFMarker < Long.MAX_VALUE && lastObjOffset > 0)
+            {
+                // if the pdf wasn't cut off in the middle the last object id has to added here
+                // so that it can't get lost as there isn't any subsequent object id
+                bfSearchCOSObjectKeyOffsets.put(new COSObjectKey(lastObjectId, lastGenID),
+                        lastObjOffset);
+            }
             // reestablish origin position
             source.seek(originOffset);
         }