vcl/inc/font/TTFReader.hxx | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-)
New commits: commit cae28bbd3c9504f25a2910c5c75498d17fd618df Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Tue May 27 12:44:17 2025 +0100 Commit: Caolán McNamara <caolan.mcnam...@collabora.com> CommitDate: Tue May 27 16:37:39 2025 +0200 sanity check NameTable Change-Id: I8eba80747511ac3114676be486337183315890e1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185903 Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Tested-by: Jenkins diff --git a/vcl/inc/font/TTFReader.hxx b/vcl/inc/font/TTFReader.hxx index d45a1e2a6300..67973290b2bd 100644 --- a/vcl/inc/font/TTFReader.hxx +++ b/vcl/inc/font/TTFReader.hxx @@ -26,8 +26,19 @@ private: const char* mpNameTablePointer; const NameTable* mpNameTable; - const char* getTablePointer(const TableDirectoryEntry* pEntry) + const char* getTablePointer(const TableDirectoryEntry* pEntry, size_t nEntrySize) { + size_t nSize = mrFontDataContainer.size(); + if (pEntry->offset > nSize) + { + SAL_WARN("vcl.fonts", "Table offset beyond end of available data"); + return nullptr; + } + if (nEntrySize > nSize - pEntry->offset) + { + SAL_WARN("vcl.fonts", "Insufficient available data for table entry"); + return nullptr; + } return mrFontDataContainer.getPointer() + pEntry->offset; } @@ -36,7 +47,7 @@ public: const TableDirectoryEntry* pTableDirectoryEntry) : mrFontDataContainer(rFontDataContainer) , mpTableDirectoryEntry(pTableDirectoryEntry) - , mpNameTablePointer(getTablePointer(mpTableDirectoryEntry)) + , mpNameTablePointer(getTablePointer(mpTableDirectoryEntry, sizeof(NameTable))) , mpNameTable(reinterpret_cast<const NameTable*>(mpNameTablePointer)) { } @@ -46,7 +57,7 @@ public: const NameTable* getNameTable() { return mpNameTable; } /** Number of tables */ - sal_uInt16 getNumberOfRecords() { return mpNameTable->nCount; } + sal_uInt16 getNumberOfRecords() { return mpNameTable ? mpNameTable->nCount : 0; } /** Get a name table record for index */ const NameRecord* getNameRecord(sal_uInt32 index) commit e6f2f0744e1595cbe7bb03933f71e7dbb5e06174 Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Tue May 27 12:23:44 2025 +0100 Commit: Caolán McNamara <caolan.mcnam...@collabora.com> CommitDate: Tue May 27 16:37:31 2025 +0200 sanity check table offsets and claimed lengths Change-Id: I9c9f3b5f3efcecbe12f6a8ad08455e1f18e6a642 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185900 Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com> Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> diff --git a/vcl/inc/font/TTFReader.hxx b/vcl/inc/font/TTFReader.hxx index 7e161abd2829..d45a1e2a6300 100644 --- a/vcl/inc/font/TTFReader.hxx +++ b/vcl/inc/font/TTFReader.hxx @@ -93,8 +93,19 @@ private: const char* mpFirstPosition; sal_uInt16 mnNumberOfTables; - const char* getTablePointer(const TableDirectoryEntry* pEntry) + const char* getTablePointer(const TableDirectoryEntry* pEntry, size_t nEntrySize) { + size_t nSize = mrFontDataContainer.size(); + if (pEntry->offset > nSize) + { + SAL_WARN("vcl.fonts", "Table offset beyond end of available data"); + return nullptr; + } + if (nEntrySize > nSize - pEntry->offset) + { + SAL_WARN("vcl.fonts", "Insufficient available data for table entry"); + return nullptr; + } return mrFontDataContainer.getPointer() + pEntry->offset; } @@ -138,7 +149,7 @@ public: const auto* pEntry = getEntry(T_OS2); if (!pEntry) return nullptr; - return reinterpret_cast<const OS2Table*>(getTablePointer(pEntry)); + return reinterpret_cast<const OS2Table*>(getTablePointer(pEntry, sizeof(OS2Table))); } const HeadTable* getHeadTable() @@ -146,7 +157,7 @@ public: const auto* pEntry = getEntry(T_head); if (!pEntry) return nullptr; - return reinterpret_cast<const HeadTable*>(getTablePointer(pEntry)); + return reinterpret_cast<const HeadTable*>(getTablePointer(pEntry, sizeof(HeadTable))); } const NameTable* getNameTable() @@ -154,7 +165,7 @@ public: const auto* pEntry = getEntry(T_name); if (!pEntry) return nullptr; - return reinterpret_cast<const NameTable*>(getTablePointer(pEntry)); + return reinterpret_cast<const NameTable*>(getTablePointer(pEntry, sizeof(NameTable))); } std::unique_ptr<NameTableHandler> getNameTableHandler()