Author: lehmi
Date: Sat Sep 16 17:35:57 2023
New Revision: 1912357

URL: http://svn.apache.org/viewvc?rev=1912357&view=rev
Log:
PDFBOX-5681: avoid ConcurrentModificationException 

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java?rev=1912357&r1=1912356&r2=1912357&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java 
(original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java 
Sat Sep 16 17:35:57 2023
@@ -251,12 +251,27 @@ public class COSDocument extends COSBase
      */
     public List<COSObject> getObjectsByType(COSName type1, COSName type2)
     {
+        List<COSObjectKey> originKeys = new 
ArrayList<COSObjectKey>(xrefTable.keySet());
+        List<COSObject> retval = getObjectsByType(originKeys, type1, type2);
+        // there might be some additional objects if the brute force parser 
was triggered
+        // due to a broken cross reference table/stream
+        if (originKeys.size() < xrefTable.size())
+        {
+            List<COSObjectKey> additionalKeys = new 
ArrayList<COSObjectKey>(xrefTable.keySet());
+            additionalKeys.removeAll(originKeys);
+            retval.addAll(getObjectsByType(additionalKeys, type1, type2));
+        }
+        return retval;
+    }
+
+    private List<COSObject> getObjectsByType(List<COSObjectKey> keys, COSName 
type1, COSName type2)
+    {
         List<COSObject> retval = new ArrayList<>();
-        for (COSObjectKey objectKey : xrefTable.keySet())
+        for (COSObjectKey objectKey : keys)
         {
             COSObject objectFromPool = getObjectFromPool(objectKey);
             COSBase realObject = objectFromPool.getObject();
-            if( realObject instanceof COSDictionary )
+            if (realObject instanceof COSDictionary)
             {
                 COSName dictType = ((COSDictionary) 
realObject).getCOSName(COSName.TYPE);
                 if (type1.equals(dictType) || (type2 != null && 
type2.equals(dictType)))


Reply via email to