fix stackoverflow on pdfmerger (#252)

Obj Ref1
 Kids: [Ref2]

Obj Ref2
 Parent: Ref1
This commit is contained in:
Romain V
2021-01-08 22:35:19 +01:00
committed by GitHub
parent 7239396665
commit 19e831b656
3 changed files with 27 additions and 5 deletions

View File

@@ -2,6 +2,7 @@
{
using Integration;
using PdfPig.Writer;
using System;
using System.IO;
using Xunit;
@@ -172,5 +173,22 @@
// ignored.
}
}
[Fact]
public void NoStackoverflow()
{
try
{
var bytes = PdfMerger.Merge(IntegrationHelpers.GetDocumentPath("68-1990-01_A.pdf"));
using (var document = PdfDocument.Open(bytes, ParsingOptions.LenientParsingOff))
{
Assert.Equal(45, document.NumberOfPages);
}
}
catch (StackOverflowException)
{
Assert.True(false);
}
}
}
}

View File

@@ -415,15 +415,15 @@
return newReferenceToken;
}
var tokenObject = DirectObjectFinder.Get<IToken>(referenceToken.Data, tokenScanner);
//we add the token to referencesFromDocument to prevent stackoverflow on references cycles
newReferenceToken = context.ReserveNumberToken();
referencesFromDocument.Add(referenceToken, newReferenceToken);
var tokenObject = DirectObjectFinder.Get<IToken>(referenceToken.Data, tokenScanner);
Debug.Assert(!(tokenObject is IndirectReferenceToken));
var newToken = CopyToken(tokenObject, tokenScanner, referencesFromDocument);
newReferenceToken = context.WriteToken(newToken);
referencesFromDocument.Add(referenceToken, newReferenceToken);
context.WriteToken(newReferenceToken, newToken);
return newReferenceToken;
}
case StreamToken streamToken:

View File

@@ -89,7 +89,11 @@
// When we end up writing this token, all of his child would already have been added and checked for duplicate
return AddToken(token, reservedNumber.Value);
}
public void WriteToken(IndirectReferenceToken referenceToken, IToken token)
{
tokenReferences.Add(referenceToken, token);
}
public int ReserveNumber()