Skip to content

Commit ca123f3

Browse files
committed
Track IndirectReference instead of only ObjectNumber when checking for cycles during indirect reference resolutionv and add test
1 parent efb8c2a commit ca123f3

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

src/UglyToad.PdfPig.Tests/Integration/GithubIssuesTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,27 @@
77

88
public class GithubIssuesTests
99
{
10+
[Fact]
11+
public void Issue1096()
12+
{
13+
// Ensure no StackOverflowException
14+
// (already fixed by https://github.com/UglyToad/PdfPig/pull/1097)
15+
16+
var path = IntegrationHelpers.GetSpecificTestDocumentPath("issue_1096.pdf");
17+
18+
using (var document = PdfDocument.Open(path, new ParsingOptions() { UseLenientParsing = true }))
19+
{
20+
for (int p = 1; p <= document.NumberOfPages; p++)
21+
{
22+
var page = document.GetPage(p);
23+
foreach (var image in page.GetImages())
24+
{
25+
Assert.NotNull(image);
26+
}
27+
}
28+
}
29+
}
30+
1031
[Fact]
1132
public void Issue1067()
1233
{
Binary file not shown.

src/UglyToad.PdfPig/PdfExtensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,12 @@ private static double GetEstimatedSizeMultiplier(IFilter filter)
122122
/// Returns an equivalent token where any indirect references of child objects are
123123
/// recursively traversed and resolved.
124124
/// </summary>
125-
internal static T? Resolve<T>(this T? token, IPdfTokenScanner scanner, List<long>? visited = null) where T : IToken
125+
internal static T? Resolve<T>(this T? token, IPdfTokenScanner scanner, List<IndirectReference>? visited = null) where T : IToken
126126
{
127127
return (T?)ResolveInternal(token, scanner, visited ?? []);
128128
}
129129

130-
private static IToken? ResolveInternal(this IToken? token, IPdfTokenScanner scanner, List<long> visited)
130+
private static IToken? ResolveInternal(this IToken? token, IPdfTokenScanner scanner, List<IndirectReference> visited)
131131
{
132132
if (token is StreamToken stream)
133133
{
@@ -142,12 +142,12 @@ private static double GetEstimatedSizeMultiplier(IFilter filter)
142142
var value = kvp.Value;
143143
if (kvp.Value is IndirectReferenceToken reference)
144144
{
145-
if (visited.Contains(reference.Data.ObjectNumber))
145+
if (visited.Contains(reference.Data))
146146
{
147147
continue;
148148
}
149149
value = scanner.Get(reference.Data)?.Data;
150-
visited.Add(reference.Data.ObjectNumber);
150+
visited.Add(reference.Data);
151151
}
152152
resolvedItems[NameToken.Create(kvp.Key)] = ResolveInternal(value, scanner, visited);
153153
}

0 commit comments

Comments
 (0)