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 Integration;
|
||||||
using PdfPig.Writer;
|
using PdfPig.Writer;
|
||||||
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
@@ -172,5 +173,22 @@
|
|||||||
// ignored.
|
// 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;
|
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));
|
Debug.Assert(!(tokenObject is IndirectReferenceToken));
|
||||||
|
|
||||||
var newToken = CopyToken(tokenObject, tokenScanner, referencesFromDocument);
|
var newToken = CopyToken(tokenObject, tokenScanner, referencesFromDocument);
|
||||||
newReferenceToken = context.WriteToken(newToken);
|
context.WriteToken(newReferenceToken, newToken);
|
||||||
|
|
||||||
referencesFromDocument.Add(referenceToken, newReferenceToken);
|
|
||||||
|
|
||||||
return newReferenceToken;
|
return newReferenceToken;
|
||||||
}
|
}
|
||||||
case StreamToken streamToken:
|
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
|
// 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);
|
return AddToken(token, reservedNumber.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteToken(IndirectReferenceToken referenceToken, IToken token)
|
||||||
|
{
|
||||||
|
tokenReferences.Add(referenceToken, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int ReserveNumber()
|
public int ReserveNumber()
|
||||||
|
|||||||
Reference in New Issue
Block a user