[Libreoffice-commits] core.git: vcl/Executable_fftester.mk vcl/inc vcl/unx vcl/workben

Caolán McNamara caolanm at redhat.com
Fri Mar 24 11:53:33 UTC 2017


 vcl/Executable_fftester.mk                     |    6 +++++-
 vcl/inc/unx/glyphcache.hxx                     |    2 ++
 vcl/unx/generic/glyphs/freetype_glyphcache.cxx |    5 +++++
 vcl/unx/generic/glyphs/glyphcache.cxx          |   10 ++++++++++
 vcl/workben/commonfuzzer.hxx                   |    2 ++
 vcl/workben/fftester.cxx                       |   15 ++++++++++-----
 vcl/workben/pptfuzzer.cxx                      |    4 ++++
 7 files changed, 38 insertions(+), 6 deletions(-)

New commits:
commit 38e729223a4cdca87ef1baccfc533156c80b5dab
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Mar 24 10:05:49 2017 +0000

    ofz: explicitly release fontconfig options on every iteration
    
    fontconfigs alloc mechanism is too complicated for lsan/valgrind so force the
    fontconfig options to be released at the end of every iteration, they are
    demand loaded so will be recreated if necessary on next use
    
    Change-Id: I061117b1fb8136298593a165847f78eabe008f0f

diff --git a/vcl/Executable_fftester.mk b/vcl/Executable_fftester.mk
index 0eaa4e39c3c2..14fa5965193d 100644
--- a/vcl/Executable_fftester.mk
+++ b/vcl/Executable_fftester.mk
@@ -15,7 +15,11 @@ $(eval $(call gb_Executable_use_api,fftester,\
     udkapi \
 ))
 
-$(eval $(call gb_Executable_use_external,fftester,boost_headers))
+$(eval $(call gb_Executable_use_externals,fftester,\
+	boost_headers \
+	freetype_headers \
+	harfbuzz \
+))
 
 $(eval $(call gb_Executable_set_include,fftester,\
     $$(INCLUDE) \
diff --git a/vcl/inc/unx/glyphcache.hxx b/vcl/inc/unx/glyphcache.hxx
index 4c0ce0d2695a..8d66fbb23eac 100644
--- a/vcl/inc/unx/glyphcache.hxx
+++ b/vcl/inc/unx/glyphcache.hxx
@@ -67,6 +67,7 @@ public:
     void                    UncacheFont( FreetypeFont& );
     void                    ClearFontCache();
     void                    InvalidateAllGlyphs();
+    void                    ClearFontOptions();
 
 private:
     friend class FreetypeFont;
@@ -124,6 +125,7 @@ public:
     FT_Face                 GetFtFace() const;
     int                     GetLoadFlags() const { return (mnLoadFlags & ~FT_LOAD_IGNORE_TRANSFORM); }
     const FontConfigFontOptions* GetFontOptions() const;
+    void                    ClearFontOptions();
     bool                    NeedsArtificialBold() const { return mbArtBold; }
     bool                    NeedsArtificialItalic() const { return mbArtItalic; }
 
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index 0737d2bdf3d1..c24dd5f3e050 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -476,6 +476,11 @@ const FontConfigFontOptions* FreetypeFont::GetFontOptions() const
     return mxFontOptions.get();
 }
 
+void FreetypeFont::ClearFontOptions()
+{
+    mxFontOptions.reset();
+}
+
 const OString& FreetypeFont::GetFontFileName() const
 {
     return mpFontInfo->GetFontFileName();
diff --git a/vcl/unx/generic/glyphs/glyphcache.cxx b/vcl/unx/generic/glyphs/glyphcache.cxx
index 1a49c524415f..b72a0a0cd4a1 100644
--- a/vcl/unx/generic/glyphs/glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/glyphcache.cxx
@@ -64,6 +64,16 @@ void GlyphCache::InvalidateAllGlyphs()
     mpCurrentGCFont = nullptr;
 }
 
+void GlyphCache::ClearFontOptions()
+{
+    for( FontList::iterator it = maFontList.begin(), end = maFontList.end(); it != end; ++it )
+    {
+        FreetypeFont* pFreetypeFont = it->second;
+        // free demand-loaded FontConfig related data
+        pFreetypeFont->ClearFontOptions();
+    }
+}
+
 inline
 size_t GlyphCache::IFSD_Hash::operator()( const FontSelectPattern& rFontSelData ) const
 {
diff --git a/vcl/workben/commonfuzzer.hxx b/vcl/workben/commonfuzzer.hxx
index f88d835cf59d..59c0ae265f53 100644
--- a/vcl/workben/commonfuzzer.hxx
+++ b/vcl/workben/commonfuzzer.hxx
@@ -24,7 +24,9 @@
 #include <vcl/wmf.hxx>
 #include <unistd.h>
 #include <stdlib.h>
+#include "headless/svpgdi.hxx"
 #include "unx/fontmanager.hxx"
+#include "unx/glyphcache.hxx"
 
 using namespace ::com::sun::star::uno;
 using namespace ::com::sun::star::lang;
diff --git a/vcl/workben/fftester.cxx b/vcl/workben/fftester.cxx
index 3611a9dd8275..d6d74f7e48aa 100644
--- a/vcl/workben/fftester.cxx
+++ b/vcl/workben/fftester.cxx
@@ -52,6 +52,8 @@
 #include <osl/file.hxx>
 #include <unistd.h>
 #include <signal.h>
+#include "headless/svpgdi.hxx"
+#include "unx/glyphcache.hxx"
 
 #include <../source/filter/igif/gifread.hxx>
 #include <../source/filter/ixbm/xbmread.hxx>
@@ -88,6 +90,12 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
             return -1;
         }
 
+        setenv("SAL_USE_VCLPLUGIN", "svp", 1);
+        setenv("JPEGMEM", "768M", 1);
+        setenv("SAL_WMF_COMPLEXCLIP_VIA_REGION", "1", 1);
+        setenv("SAL_DISABLE_PRINTERLIST", "1", 1);
+        setenv("SAL_NO_FONT_LOOKUP", "1", 1);
+
         OUString in(argv[1], strlen(argv[1]), RTL_TEXTENCODING_UTF8);
         OUString out;
         osl::File::getFileURLFromSystemPath(in, out);
@@ -102,11 +110,6 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
         utl::ConfigManager::EnableAvoidConfig();
         InitVCL();
 
-        setenv("JPEGMEM", "768M", 1);
-        setenv("SAL_WMF_COMPLEXCLIP_VIA_REGION", "1", 1);
-        setenv("SAL_DISABLE_PRINTERLIST", "1", 1);
-        setenv("SAL_NO_FONT_LOOKUP", "1", 1);
-
 try_again:
 
         {
@@ -444,6 +447,8 @@ try_again:
         }
 
         /* If AFL_PERSISTENT not set or PERSIST_MAX exceeded, exit normally. */
+
+        SvpSalGraphics::getPlatformGlyphCache().ClearFontOptions();
     }
     catch (...)
     {
diff --git a/vcl/workben/pptfuzzer.cxx b/vcl/workben/pptfuzzer.cxx
index 45c1571171f0..6b22bba50bd8 100644
--- a/vcl/workben/pptfuzzer.cxx
+++ b/vcl/workben/pptfuzzer.cxx
@@ -32,6 +32,10 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
 {
     SvMemoryStream aStream(const_cast<uint8_t*>(data), size, StreamMode::READ);
     (void)TestImportPPT(aStream);
+    //fontconfigs alloc mechanism is too complicated for lsan/valgrind so
+    //force the fontconfig options to be released now, they are demand loaded
+    //so will be recreated if necessary
+    SvpSalGraphics::getPlatformGlyphCache().ClearFontOptions();
     return 0;
 }
 


More information about the Libreoffice-commits mailing list