diff --git a/src/UglyToad.PdfPig.Fonts/TrueType/Parser/NameTableParser.cs b/src/UglyToad.PdfPig.Fonts/TrueType/Parser/NameTableParser.cs index 5d2045b4..363e48d2 100644 --- a/src/UglyToad.PdfPig.Fonts/TrueType/Parser/NameTableParser.cs +++ b/src/UglyToad.PdfPig.Fonts/TrueType/Parser/NameTableParser.cs @@ -80,9 +80,13 @@ data.Seek(position); - var str = data.ReadString(nameRecord.Length, encoding); + if (data.TryReadString(nameRecord.Length, encoding, out var str)) + { + return nameRecord.ToNameRecord(str); + } - return nameRecord.ToNameRecord(str); + // Damaged font + return null; } catch { diff --git a/src/UglyToad.PdfPig.Fonts/TrueType/Tables/PostScriptTable.cs b/src/UglyToad.PdfPig.Fonts/TrueType/Tables/PostScriptTable.cs index 134f0d56..6f521b26 100644 --- a/src/UglyToad.PdfPig.Fonts/TrueType/Tables/PostScriptTable.cs +++ b/src/UglyToad.PdfPig.Fonts/TrueType/Tables/PostScriptTable.cs @@ -203,7 +203,10 @@ for (var i = 0; i < namesLength; i++) { var numberOfCharacters = data.ReadByte(); - nameArray[i] = data.ReadString(numberOfCharacters, Encoding.UTF8); + if (data.TryReadString(numberOfCharacters, Encoding.UTF8, out var str)) + { + nameArray[i] = str; + } } } diff --git a/src/UglyToad.PdfPig.Fonts/TrueType/TrueTypeDataBytes.cs b/src/UglyToad.PdfPig.Fonts/TrueType/TrueTypeDataBytes.cs index 80686282..6cc3bf1b 100644 --- a/src/UglyToad.PdfPig.Fonts/TrueType/TrueTypeDataBytes.cs +++ b/src/UglyToad.PdfPig.Fonts/TrueType/TrueTypeDataBytes.cs @@ -1,7 +1,6 @@ namespace UglyToad.PdfPig.Fonts.TrueType { using System; - using System.IO; using System.Text; using Core; @@ -81,22 +80,33 @@ /// public string ReadTag() { - return ReadString(4, Encoding.UTF8); + if (TryReadString(4, Encoding.UTF8, out var result)) + { + return result; + } + + throw new InvalidOperationException($"Could not read Tag from TrueType file at {inputBytes.CurrentOffset}."); } /// /// Read a of the given number of bytes in length with the specified encoding. /// - public string ReadString(int bytesToRead, Encoding encoding) + public bool TryReadString(int bytesToRead, Encoding encoding, out string result) { + result = null; if (encoding == null) { - throw new ArgumentNullException(nameof(encoding)); + return false; } byte[] data = new byte[bytesToRead]; - ReadBuffered(data, bytesToRead); - return encoding.GetString(data, 0, data.Length); + if (ReadBuffered(data, bytesToRead)) + { + result = encoding.GetString(data, 0, data.Length); + return true; + } + + return false; } /// @@ -234,13 +244,15 @@ return $"@: {Position} of {inputBytes.Length} bytes."; } - private void ReadBuffered(byte[] buffer, int length) + private bool ReadBuffered(byte[] buffer, int length) { var read = inputBytes.Read(buffer, length); if (read < length) { - throw new EndOfStreamException($"Could not read a buffer of {length} bytes."); + return false; } + + return true; } } }