Skip to content

Commit 89abf6d

Browse files
committed
Skip creating IndirectReference in CrossReferenceTablePartBuilder when generationNumber is more than 65,535
1 parent 24431b1 commit 89abf6d

File tree

6 files changed

+51
-5
lines changed

6 files changed

+51
-5
lines changed

src/UglyToad.PdfPig.Core/IndirectReference.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@
3939
[DebuggerStepThrough]
4040
public IndirectReference(long objectNumber, int generation)
4141
{
42-
if (generation < 0 || generation > ushort.MaxValue)
42+
if (generation < 0)
4343
{
44-
throw new ArgumentOutOfRangeException(nameof(generation), "Generation number must not be a negative value, and less or equal to 65,535.");
44+
// Note: We do not check generation for max value and let it overflow
45+
throw new ArgumentOutOfRangeException(nameof(generation), "Generation number must not be a negative value.");
4546
}
4647

4748
if (objectNumber < -MAX_OBJECT_NUMBER || objectNumber > MAX_OBJECT_NUMBER)

src/UglyToad.PdfPig.Tests/ContentStream/IndirectReferenceTests.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,20 @@ public void IndirectReferenceHashTest()
6363
Assert.StartsWith("Object number must be between -140,737,488,355,327 and 140,737,488,355,327.", ex1.Message);
6464

6565
var ex2 = Assert.Throws<ArgumentOutOfRangeException>(() => new IndirectReference(1574, -1));
66-
Assert.StartsWith("Generation number must not be a negative value, and less or equal to 65,535.", ex2.Message);
67-
var ex3 = Assert.Throws<ArgumentOutOfRangeException>(() => new IndirectReference(1574, ushort.MaxValue + 1));
68-
Assert.StartsWith("Generation number must not be a negative value, and less or equal to 65,535.", ex3.Message);
66+
Assert.StartsWith("Generation number must not be a negative value.", ex2.Message);
67+
68+
// We make sure object number is still correct even if generation is not
69+
var reference6 = new IndirectReference(1574, int.MaxValue);
70+
Assert.Equal(1574, reference6.ObjectNumber);
71+
72+
var reference7 = new IndirectReference(-1574, ushort.MaxValue + 10);
73+
Assert.Equal(-1574, reference7.ObjectNumber);
74+
75+
var reference9 = new IndirectReference(-140737488355327, ushort.MaxValue + 10);
76+
Assert.Equal(-140737488355327, reference9.ObjectNumber);
77+
78+
var reference10 = new IndirectReference(140737488355327, ushort.MaxValue * 10);
79+
Assert.Equal(140737488355327, reference10.ObjectNumber);
6980
}
7081

7182
[Fact]
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
namespace UglyToad.PdfPig.Tests.Integration
2+
{
3+
using DocumentLayoutAnalysis.WordExtractor;
4+
using System.Linq;
5+
6+
public class IndirectReferenceTests
7+
{
8+
[Fact]
9+
public void Generation65536()
10+
{
11+
using (var document = PdfDocument.Open(IntegrationHelpers.GetSpecificTestDocumentPath("93101_1.pdf")))
12+
{
13+
var page = document.GetPage(1);
14+
var words = NearestNeighbourWordExtractor.Instance.GetWords(page.Letters).ToArray();
15+
Assert.NotEmpty(words);
16+
17+
Assert.Equal("Railway", words[0].Text);
18+
19+
for (int p = 2; p <= document.NumberOfPages; ++p)
20+
{
21+
page = document.GetPage(p);
22+
Assert.NotEmpty(page.Letters);
23+
}
24+
}
25+
}
26+
}
27+
}
Binary file not shown.

src/UglyToad.PdfPig/CrossReference/CrossReferenceTablePartBuilder.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ internal class CrossReferenceTablePartBuilder
2020

2121
public void Add(long objectId, int generationNumber, long offset)
2222
{
23+
if (generationNumber > ushort.MaxValue)
24+
{
25+
// We skip invalid generation number
26+
return;
27+
}
28+
2329
IndirectReference objKey = new IndirectReference(objectId, generationNumber);
2430

2531
if (!objects.ContainsKey(objKey))

src/UglyToad.PdfPig/Tokenization/Scanner/PdfTokenScanner.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,7 @@ public void DeregisterCustomTokenizer(ITokenizer tokenizer)
745745

746746
if (offset == 0 && reference.Generation > ushort.MaxValue)
747747
{
748+
// TODO - To remove as should not happen anymore
748749
return new ObjectToken(offset, reference, NullToken.Instance);
749750
}
750751

0 commit comments

Comments
 (0)