Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/UglyToad.PdfPig.Tests/Integration/GithubIssuesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@

public class GithubIssuesTests
{
[Fact]
public void Issue1122()
{
var path = IntegrationHelpers.GetSpecificTestDocumentPath("StackOverflow_Issue_1122.pdf");

var ex = Assert.Throws<PdfDocumentFormatException>(() => PdfDocument.Open(path, new ParsingOptions() { UseLenientParsing = true }));
Assert.StartsWith("Reached maximum search depth while getting indirect reference.", ex.Message);
}

[Fact]
public void Issue1096()
{
Expand Down
Binary file not shown.
25 changes: 20 additions & 5 deletions src/UglyToad.PdfPig/Tokenization/Scanner/PdfTokenScanner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -625,7 +625,8 @@ private DictionaryToken GetStreamDictionary()
{
if (offset < 0)
{
var result = GetObjectFromStream(lengthReference.Data, offset);
ushort searchDepth = 0;
var result = GetObjectFromStream(lengthReference.Data, offset, ref searchDepth);

if (!(result.Data is NumericToken streamLengthToken))
{
Expand Down Expand Up @@ -714,9 +715,23 @@ public void DeregisterCustomTokenizer(ITokenizer tokenizer)

coreTokenScanner.DeregisterCustomTokenizer(tokenizer);
}

public ObjectToken? Get(IndirectReference reference)
{
ushort searchDepth = 0;
return Get(reference, ref searchDepth);
}

private ObjectToken? Get(IndirectReference reference, ref ushort searchDepth)
{
if (searchDepth > 1_000)
{
throw new PdfDocumentFormatException("Reached maximum search depth while getting indirect reference.");
}

searchDepth++;


if (isDisposed)
{
throw new ObjectDisposedException(nameof(PdfTokenScanner));
Expand All @@ -740,7 +755,7 @@ public void DeregisterCustomTokenizer(ITokenizer tokenizer)
// Negative offsets refer to a stream with that number.
if (offset < 0)
{
var result = GetObjectFromStream(reference, offset);
var result = GetObjectFromStream(reference, offset, ref searchDepth);

return result;
}
Expand Down Expand Up @@ -802,11 +817,11 @@ private ObjectToken BruteForceFileToFindReference(IndirectReference reference)
}
}

private ObjectToken GetObjectFromStream(IndirectReference reference, long offset)
private ObjectToken GetObjectFromStream(IndirectReference reference, long offset, ref ushort searchDepth)
{
var streamObjectNumber = offset * -1;

var streamObject = Get(new IndirectReference(streamObjectNumber, 0));
var streamObject = Get(new IndirectReference(streamObjectNumber, 0), ref searchDepth);

if (!(streamObject?.Data is StreamToken stream))
{
Expand Down
Loading