From 4ea95d87070f3850742c99b09ef025bcd68d1635 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 20 Feb 2025 23:57:38 +0900 Subject: [PATCH] loader: fixed potential memory leaks in font handling Simply loading a font doesn't mean it is in use. Fixed the loader's reference count to prevent incorrect increments. --- src/renderer/tvgLoader.cpp | 6 +++++- src/renderer/tvgText.cpp | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/renderer/tvgLoader.cpp b/src/renderer/tvgLoader.cpp index 562102dd..dea650bf 100644 --- a/src/renderer/tvgLoader.cpp +++ b/src/renderer/tvgLoader.cpp @@ -267,7 +267,11 @@ bool LoaderMgr::term() auto loader = _activeLoaders.head; //clean up the remained font loaders which is globally used. - while (loader && loader->type == FileType::Ttf) { + while (loader) { + if (loader->type != FileType::Ttf) { + loader = loader->next; + continue; + } auto ret = loader->close(); auto tmp = loader; loader = loader->next; diff --git a/src/renderer/tvgText.cpp b/src/renderer/tvgText.cpp index a09bb302..2b2aea31 100644 --- a/src/renderer/tvgText.cpp +++ b/src/renderer/tvgText.cpp @@ -62,7 +62,11 @@ Result Text::load(const std::string& path) noexcept { #ifdef THORVG_FILE_IO_SUPPORT bool invalid; //invalid path - if (!LoaderMgr::loader(path, &invalid)) { + auto loader = LoaderMgr::loader(path, &invalid); + if (loader) { + if (loader->sharing > 0) --loader->sharing; //font loading doesn't mean sharing. + return Result::Success; + } else { if (invalid) return Result::InvalidArguments; else return Result::NonSupport; }