mirror of
https://github.com/UglyToad/PdfPig.git
synced 2025-08-20 04:31:25 +08:00
Track IndirectReference instead of only ObjectNumber when checking for cycles during indirect reference resolutionv and add test
This commit is contained in:
parent
2b11961c8c
commit
813d3baa18
@ -7,6 +7,27 @@
|
||||
|
||||
public class GithubIssuesTests
|
||||
{
|
||||
[Fact]
|
||||
public void Issue1096()
|
||||
{
|
||||
// Ensure no StackOverflowException
|
||||
// (already fixed by https://github.com/UglyToad/PdfPig/pull/1097)
|
||||
|
||||
var path = IntegrationHelpers.GetSpecificTestDocumentPath("issue_1096.pdf");
|
||||
|
||||
using (var document = PdfDocument.Open(path, new ParsingOptions() { UseLenientParsing = true }))
|
||||
{
|
||||
for (int p = 1; p <= document.NumberOfPages; p++)
|
||||
{
|
||||
var page = document.GetPage(p);
|
||||
foreach (var image in page.GetImages())
|
||||
{
|
||||
Assert.NotNull(image);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Issue1067()
|
||||
{
|
||||
|
Binary file not shown.
@ -122,12 +122,12 @@
|
||||
/// Returns an equivalent token where any indirect references of child objects are
|
||||
/// recursively traversed and resolved.
|
||||
/// </summary>
|
||||
internal static T? Resolve<T>(this T? token, IPdfTokenScanner scanner, List<long>? visited = null) where T : IToken
|
||||
internal static T? Resolve<T>(this T? token, IPdfTokenScanner scanner, List<IndirectReference>? visited = null) where T : IToken
|
||||
{
|
||||
return (T?)ResolveInternal(token, scanner, visited ?? []);
|
||||
}
|
||||
|
||||
private static IToken? ResolveInternal(this IToken? token, IPdfTokenScanner scanner, List<long> visited)
|
||||
private static IToken? ResolveInternal(this IToken? token, IPdfTokenScanner scanner, List<IndirectReference> visited)
|
||||
{
|
||||
if (token is StreamToken stream)
|
||||
{
|
||||
@ -142,12 +142,12 @@
|
||||
var value = kvp.Value;
|
||||
if (kvp.Value is IndirectReferenceToken reference)
|
||||
{
|
||||
if (visited.Contains(reference.Data.ObjectNumber))
|
||||
if (visited.Contains(reference.Data))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
value = scanner.Get(reference.Data)?.Data;
|
||||
visited.Add(reference.Data.ObjectNumber);
|
||||
visited.Add(reference.Data);
|
||||
}
|
||||
resolvedItems[NameToken.Create(kvp.Key)] = ResolveInternal(value, scanner, visited);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user