mirror of
https://github.com/UglyToad/PdfPig.git
synced 2026-03-10 00:23:29 +08:00
fix stackoverflow on pdfmerger (#252)
Obj Ref1 Kids: [Ref2] Obj Ref2 Parent: Ref1
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user