From 1b5927b2a5c8b64944bc9bf29e142b5d8db126a7 Mon Sep 17 00:00:00 2001 From: EliotJones Date: Sun, 14 Sep 2025 16:00:10 +0200 Subject: [PATCH] handle case where offsets are out of range default to returning empty glyph where the offset is out of the file length range, this fixes file 12623 where the truetype file is completely broken --- .../TrueType/Tables/GlyphDataTable.cs | 13 ++++++++++-- .../Parser/TrueTypeFontParserTests.cs | 14 ++++++++++++ .../Fonts/TrueType/corrupt-12623.ttf | Bin 0 -> 51632 bytes .../UglyToad.PdfPig.Tests.csproj | 20 ++---------------- 4 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 src/UglyToad.PdfPig.Tests/Fonts/TrueType/corrupt-12623.ttf diff --git a/src/UglyToad.PdfPig.Fonts/TrueType/Tables/GlyphDataTable.cs b/src/UglyToad.PdfPig.Fonts/TrueType/Tables/GlyphDataTable.cs index 377034d0b..77bb05423 100644 --- a/src/UglyToad.PdfPig.Fonts/TrueType/Tables/GlyphDataTable.cs +++ b/src/UglyToad.PdfPig.Fonts/TrueType/Tables/GlyphDataTable.cs @@ -121,14 +121,23 @@ private IReadOnlyList ReadGlyphs() for (var i = 0; i < glyphCount; i++) { - if (offsets[i + 1] <= offsets[i]) + var offset = offsets[i]; + + if (offsets[i + 1] <= offset) { // empty glyph result[i] = emptyGlyph; continue; } - data.Seek(offsets[i]); + // Invalid table, just sub in the empty glyph + if (offset >= data.Length) + { + result[i] = emptyGlyph; + continue; + } + + data.Seek(offset); var contourCount = data.ReadSignedShort(); diff --git a/src/UglyToad.PdfPig.Tests/Fonts/TrueType/Parser/TrueTypeFontParserTests.cs b/src/UglyToad.PdfPig.Tests/Fonts/TrueType/Parser/TrueTypeFontParserTests.cs index c2f341688..a06e6e157 100644 --- a/src/UglyToad.PdfPig.Tests/Fonts/TrueType/Parser/TrueTypeFontParserTests.cs +++ b/src/UglyToad.PdfPig.Tests/Fonts/TrueType/Parser/TrueTypeFontParserTests.cs @@ -229,5 +229,19 @@ public void ParseIssue258CorruptNameTable() Assert.NotNull(font.TableRegister.NameTable); Assert.NotEmpty(font.TableRegister.NameTable.NameRecords); } + + [Fact] + public void Parse12623CorruptFileAndGetGlyphs() + { + var bytes = TrueTypeTestHelper.GetFileBytes("corrupt-12623"); + + var input = new TrueTypeDataBytes(new MemoryInputBytes(bytes)); + + var font = TrueTypeFontParser.Parse(input); + + Assert.NotNull(font); + + font.TryGetPath(1, out _); + } } } diff --git a/src/UglyToad.PdfPig.Tests/Fonts/TrueType/corrupt-12623.ttf b/src/UglyToad.PdfPig.Tests/Fonts/TrueType/corrupt-12623.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6e56486e1f0a12723a764dfa9d20d7c5455ba1e4 GIT binary patch literal 51632 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

W7x0 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 I?PUz}KenZXF8}}l literal 0 HcmV?d00001 diff --git a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj index 48b5e10f0..a4f321759 100644 --- a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj +++ b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj @@ -39,11 +39,7 @@ - - - - - + @@ -61,24 +57,12 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - + PreserveNewest PreserveNewest - - PreserveNewest -