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)))