From cc013823446cb2eb5e1f210f46d43060be7ea98c Mon Sep 17 00:00:00 2001
From: Oliver Schmidtmer <O.Schmidtmer@elo.com>
Date: Tue, 5 Oct 2021 16:51:30 +0200
Subject: [PATCH] only replace xRef with corrected entries, if the original
 entry was not valid

---
 .../java/org/apache/pdfbox/pdfparser/COSParser.java  | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java b/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
index fc9d2de8cad..afde3c1305a 100644
--- a/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
+++ b/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
@@ -1159,6 +1159,7 @@ private boolean validateXrefOffsets(Map<COSObjectKey, Long> xrefOffset) throws I
             return true;
         }
         Map<COSObjectKey, COSObjectKey> correctedKeys = new HashMap<>();
+        Map<COSObjectKey, COSObjectKey> validKeys = new HashMap<>();
         for (Entry<COSObjectKey, Long> objectEntry : xrefOffset.entrySet())
         {
             COSObjectKey objectKey = objectEntry.getKey();
@@ -1178,13 +1179,18 @@ else if (foundObjectKey != objectKey)
                 {
                     // Generation was fixed - need to update map later, after iteration
                     correctedKeys.put(objectKey, foundObjectKey);
+                } else {
+                    validKeys.put(objectKey, foundObjectKey);
                 }
             }
         }
         for (Entry<COSObjectKey, COSObjectKey> correctedKeyEntry : correctedKeys.entrySet())
         {
-            xrefOffset.put(correctedKeyEntry.getValue(),
-                    xrefOffset.remove(correctedKeyEntry.getKey()));
+            if(!validKeys.containsKey(correctedKeyEntry.getValue())) {
+                // Only replacy entries, if the original entry does not point to a valid object
+                xrefOffset.put(correctedKeyEntry.getValue(),
+                        xrefOffset.remove(correctedKeyEntry.getKey()));
+            }
         }
         return true;
     }
@@ -1237,8 +1243,10 @@ private COSObjectKey findObjectKey(COSObjectKey objectKey, long offset) throws I
             // try to read the given object/generation number
             long foundObjectNumber = readObjectNumber();
             if(objectKey.getNumber() != foundObjectNumber){
+                System.out.println("found wrong object number. expected [" + objectKey.getNumber() +"] found ["+ foundObjectNumber + "]");
                 LOG.warn("found wrong object number. expected [" + objectKey.getNumber() +"] found ["+ foundObjectNumber + "]");
                 if(!isLenient) return null;
+                else objectKey = new COSObjectKey(foundObjectNumber, objectKey.getGeneration());
             }
 
             int genNumber = readGenerationNumber();