[tbb-commits] [tor-browser/tor-browser-52.5.2esr-7.5-2] Bug 23970: Printing to a file is broken with Linux content sandboxing enabled

gk at torproject.org gk at torproject.org
Fri Dec 15 10:14:14 UTC 2017


commit 9dadb90813c148d623d3bd35b629eebf499d27c4
Author: Richard Pospesel <richard at torproject.org>
Date:   Mon Nov 27 13:57:32 2017 -0800

    Bug 23970: Printing to a file is broken with Linux content sandboxing enabled
    
    Ported over firefox patch 5c25a123203a (Bug 1309205 Part 1)
---
 gfx/2d/2D.h                     | 12 ++++++++++++
 gfx/2d/Factory.cpp              | 25 +++++++++++++++++++++++++
 gfx/thebes/gfxAndroidPlatform.h |  4 +---
 gfx/thebes/gfxFT2FontList.cpp   | 10 +++++-----
 gfx/thebes/gfxFontconfigFonts.h |  5 ++---
 gfx/thebes/gfxPlatform.cpp      |  4 ++++
 gfx/thebes/gfxPlatform.h        |  5 +++++
 gfx/thebes/gfxPlatformGtk.cpp   | 10 ++++++++++
 gfx/thebes/gfxPlatformGtk.h     |  2 ++
 9 files changed, 66 insertions(+), 11 deletions(-)

diff --git a/gfx/2d/2D.h b/gfx/2d/2D.h
index c1fba3463a8f..3d5fb52ad925 100644
--- a/gfx/2d/2D.h
+++ b/gfx/2d/2D.h
@@ -41,6 +41,9 @@ typedef _cairo_scaled_font cairo_scaled_font_t;
 struct _FcPattern;
 typedef _FcPattern FcPattern;
 
+struct FT_LibraryRec_;
+typedef FT_LibraryRec_* FT_Library;
+
 struct ID3D11Texture2D;
 struct ID3D11Device;
 struct ID2D1Device;
@@ -1483,6 +1486,15 @@ public:
     CreateCGGlyphRenderingOptions(const Color &aFontSmoothingBackgroundColor);
 #endif
 
+#ifdef MOZ_ENABLE_FREETYPE
+  static void SetFTLibrary(FT_Library aFTLibrary);
+  static FT_Library GetFTLibrary();
+
+private:
+  static FT_Library mFTLibrary;
+public:
+#endif
+
 #ifdef WIN32
   static already_AddRefed<DrawTarget> CreateDrawTargetForD3D11Texture(ID3D11Texture2D *aTexture, SurfaceFormat aFormat);
 
diff --git a/gfx/2d/Factory.cpp b/gfx/2d/Factory.cpp
index 5cd5d14eaba1..ceebce690afb 100644
--- a/gfx/2d/Factory.cpp
+++ b/gfx/2d/Factory.cpp
@@ -156,6 +156,10 @@ namespace gfx {
 // In Gecko, this value is managed by gfx.logging.level in gfxPrefs.
 int32_t LoggingPrefs::sGfxLogLevel = LOG_DEFAULT;
 
+#ifdef MOZ_ENABLE_FREETYPE
+FT_Library Factory::mFTLibrary = nullptr;
+#endif
+
 #ifdef WIN32
 ID3D11Device *Factory::mD3D11Device = nullptr;
 ID2D1Device *Factory::mD2D1Device = nullptr;
@@ -192,6 +196,12 @@ Factory::ShutDown()
     delete sConfig;
     sConfig = nullptr;
   }
+
+#ifdef MOZ_ENABLE_FREETYPE
+  if (mFTLibrary) {
+    mFTLibrary = nullptr;
+  }
+#endif
 }
 
 bool
@@ -579,6 +589,21 @@ Factory::CreateDualDrawTarget(DrawTarget *targetA, DrawTarget *targetB)
 }
 
 
+#ifdef MOZ_ENABLE_FREETYPE
+void
+Factory::SetFTLibrary(FT_Library aFTLibrary)
+{
+  mFTLibrary = aFTLibrary;
+}
+
+FT_Library
+Factory::GetFTLibrary()
+{
+  MOZ_ASSERT(mFTLibrary);
+  return mFTLibrary;
+}
+#endif
+
 #ifdef WIN32
 already_AddRefed<DrawTarget>
 Factory::CreateDrawTargetForD3D11Texture(ID3D11Texture2D *aTexture, SurfaceFormat aFormat)
diff --git a/gfx/thebes/gfxAndroidPlatform.h b/gfx/thebes/gfxAndroidPlatform.h
index 30e7c89babeb..889928da86a7 100644
--- a/gfx/thebes/gfxAndroidPlatform.h
+++ b/gfx/thebes/gfxAndroidPlatform.h
@@ -19,8 +19,6 @@ namespace mozilla {
 };
 using mozilla::dom::FontListEntry;
 
-typedef struct FT_LibraryRec_ *FT_Library;
-
 class gfxAndroidPlatform : public gfxPlatform {
 public:
     gfxAndroidPlatform();
@@ -60,7 +58,7 @@ public:
     virtual bool FontHintingEnabled() override;
     virtual bool RequiresLinearZoom() override;
 
-    FT_Library GetFTLibrary();
+    FT_Library GetFTLibrary() override;
 
     virtual bool CanRenderContentToDataSurface() const override {
       return true;
diff --git a/gfx/thebes/gfxFT2FontList.cpp b/gfx/thebes/gfxFT2FontList.cpp
index 8a652df0dd34..2d9e09efe1c0 100644
--- a/gfx/thebes/gfxFT2FontList.cpp
+++ b/gfx/thebes/gfxFT2FontList.cpp
@@ -13,7 +13,6 @@
 #include "mozilla/UniquePtr.h"
 #include "mozilla/UniquePtrExtensions.h"
 #include "nsIInputStream.h"
-#define gfxToolkitPlatform gfxAndroidPlatform
 
 #include "nsXULAppAPI.h"
 #include <dirent.h>
@@ -85,7 +84,8 @@ public:
 
         NS_ASSERTION(!aFontEntry->mFilename.IsEmpty(),
                      "can't use AutoFTFace for fonts without a filename");
-        FT_Library ft = gfxToolkitPlatform::GetPlatform()->GetFTLibrary();
+        FT_Library ft = gfxPlatform::GetPlatform()->GetFTLibrary();
+        MOZ_ASSERT(ft);
 
         // A relative path (no initial "/") means this is a resource in
         // omnijar, not an installed font on the device.
@@ -256,7 +256,7 @@ FT2FontEntry::CreateFontEntry(const nsAString& aFontName,
     // eventually deleted.
     FT_Face face;
     FT_Error error =
-        FT_New_Memory_Face(gfxToolkitPlatform::GetPlatform()->GetFTLibrary(),
+        FT_New_Memory_Face(gfxPlatform::GetPlatform()->GetFTLibrary(),
                            aFontData, aLength, 0, &face);
     if (error != FT_Err_Ok) {
         free((void*)aFontData);
@@ -974,7 +974,7 @@ gfxFT2FontList::AppendFacesFromFontFile(const nsCString& aFileName,
         return;
     }
 
-    FT_Library ftLibrary = gfxAndroidPlatform::GetPlatform()->GetFTLibrary();
+    FT_Library ftLibrary = gfxPlatform::GetPlatform()->GetFTLibrary();
     FT_Face dummy;
     if (FT_Err_Ok == FT_New_Face(ftLibrary, aFileName.get(), -1, &dummy)) {
         LOG(("reading font info via FreeType for %s", aFileName.get()));
@@ -1126,7 +1126,7 @@ gfxFT2FontList::AppendFacesFromOmnijarEntry(nsZipArchive* aArchive,
         return;
     }
 
-    FT_Library ftLibrary = gfxAndroidPlatform::GetPlatform()->GetFTLibrary();
+    FT_Library ftLibrary = gfxPlatform::GetPlatform()->GetFTLibrary();
 
     FT_Face dummy;
     if (FT_Err_Ok != FT_New_Memory_Face(ftLibrary, buf.get(), bufSize, 0, &dummy)) {
diff --git a/gfx/thebes/gfxFontconfigFonts.h b/gfx/thebes/gfxFontconfigFonts.h
index cea9d0dbfaf2..cd59cfc68c62 100644
--- a/gfx/thebes/gfxFontconfigFonts.h
+++ b/gfx/thebes/gfxFontconfigFonts.h
@@ -55,6 +55,8 @@ public:
                                       const uint8_t* aFontData,
                                       uint32_t aLength);
 
+    static FT_Library GetFTLibrary();
+
 private:
 
     virtual gfxFont *GetFontAt(int32_t i, uint32_t aCh = 0x20);
@@ -116,9 +118,6 @@ private:
                                nsIAtom *aLanguage,
                                nsTArray<nsString>& aGenericFamilies);
 
-
-    friend class gfxSystemFcFontEntry;
-    static FT_Library GetFTLibrary();
 };
 
 #endif /* GFX_FONTCONFIG_FONTS_H */
diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp
index 2e4ec990f8b3..4843554d655b 100644
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -752,6 +752,10 @@ gfxPlatform::Init()
         NS_RUNTIMEABORT("Could not initialize gfxFontCache");
     }
 
+#ifdef MOZ_ENABLE_FREETYPE
+    Factory::SetFTLibrary(gPlatform->GetFTLibrary());
+#endif
+
     /* Create and register our CMS Override observer. */
     gPlatform->mSRGBOverrideObserver = new SRGBOverrideObserver();
     Preferences::AddWeakObserver(gPlatform->mSRGBOverrideObserver, GFX_PREF_CMS_FORCE_SRGB);
diff --git a/gfx/thebes/gfxPlatform.h b/gfx/thebes/gfxPlatform.h
index 68bb99ea44e9..5ef792b67a40 100644
--- a/gfx/thebes/gfxPlatform.h
+++ b/gfx/thebes/gfxPlatform.h
@@ -39,6 +39,7 @@ class nsIAtom;
 class nsIObserver;
 class SRGBOverrideObserver;
 class gfxTextPerfMetrics;
+typedef struct FT_LibraryRec_ *FT_Library;
 
 namespace mozilla {
 namespace gl {
@@ -681,6 +682,10 @@ public:
      */
     virtual void ImportGPUDeviceData(const mozilla::gfx::GPUDeviceData& aData);
 
+    virtual FT_Library GetFTLibrary() {
+      return nullptr;
+    }
+
 protected:
     gfxPlatform();
     virtual ~gfxPlatform();
diff --git a/gfx/thebes/gfxPlatformGtk.cpp b/gfx/thebes/gfxPlatformGtk.cpp
index 9d7f512f27a7..c8661a433111 100644
--- a/gfx/thebes/gfxPlatformGtk.cpp
+++ b/gfx/thebes/gfxPlatformGtk.cpp
@@ -348,6 +348,16 @@ gfxPlatformGtk::MakePlatformFont(const nsAString& aFontName,
                                            aFontData, aLength);
 }
 
+FT_Library
+gfxPlatformGtk::GetFTLibrary()
+{
+    if (sUseFcFontList) {
+        return gfxFcPlatformFontList::GetFTLibrary();
+    }
+
+    return gfxPangoFontGroup::GetFTLibrary();
+}
+
 bool
 gfxPlatformGtk::IsFontFormatSupported(nsIURI *aFontURI, uint32_t aFormatFlags)
 {
diff --git a/gfx/thebes/gfxPlatformGtk.h b/gfx/thebes/gfxPlatformGtk.h
index 982390d1867b..d0c6079bd943 100644
--- a/gfx/thebes/gfxPlatformGtk.h
+++ b/gfx/thebes/gfxPlatformGtk.h
@@ -95,6 +95,8 @@ public:
      */
     virtual void FlushContentDrawing() override;
 
+    FT_Library GetFTLibrary() override;
+
 #if (MOZ_WIDGET_GTK == 2)
     static void SetGdkDrawable(cairo_surface_t *target,
                                GdkDrawable *drawable);





More information about the tbb-commits mailing list