Title: [244018] releases/WebKitGTK/webkit-2.24
Revision
244018
Author
[email protected]
Date
2019-04-08 05:40:04 -0700 (Mon, 08 Apr 2019)

Log Message

Merge r243828 - Documents can be destroyed before their CSSFontFaceSet is destroyed
https://bugs.webkit.org/show_bug.cgi?id=195830

Reviewed by Darin Adler.

Source/WebCore:

CSSFontFaceSet has a raw pointer to its owning document. JS can keep the CSSFontFaceSet alive (by using FontFaceSet)
and can destroy the document at any time. When the document is destroyed, the link between the two objects needs to
be severed.

Test: fast/text/font-face-set-destroy-document.html

* css/CSSFontFace.cpp:
(WebCore::CSSFontFace::CSSFontFace):
* css/CSSFontFace.h:
* css/CSSFontFaceSet.cpp:
(WebCore::CSSFontFaceSet::CSSFontFaceSet):
(WebCore::CSSFontFaceSet::ensureLocalFontFacesForFamilyRegistered):
* css/CSSFontFaceSet.h:
* css/CSSFontSelector.cpp:
(WebCore::CSSFontSelector::CSSFontSelector):
(WebCore::CSSFontSelector::addFontFaceRule):
* css/CSSFontSelector.h:
* css/FontFace.cpp:
(WebCore::FontFace::FontFace):

LayoutTests:

* fast/text/font-face-set-destroy-document-expected.html: Added.
* fast/text/font-face-set-destroy-document.html: Added.

Modified Paths

Added Paths

Diff

Modified: releases/WebKitGTK/webkit-2.24/LayoutTests/ChangeLog (244017 => 244018)


--- releases/WebKitGTK/webkit-2.24/LayoutTests/ChangeLog	2019-04-08 12:39:58 UTC (rev 244017)
+++ releases/WebKitGTK/webkit-2.24/LayoutTests/ChangeLog	2019-04-08 12:40:04 UTC (rev 244018)
@@ -1,3 +1,13 @@
+2019-04-03  Myles C. Maxfield  <[email protected]>
+
+        Documents can be destroyed before their CSSFontFaceSet is destroyed
+        https://bugs.webkit.org/show_bug.cgi?id=195830
+
+        Reviewed by Darin Adler.
+
+        * fast/text/font-face-set-destroy-document-expected.html: Added.
+        * fast/text/font-face-set-destroy-document.html: Added.
+
 2019-03-26  Dean Jackson  <[email protected]>
 
         vertexAttribPointer must restrict offset parameter

Added: releases/WebKitGTK/webkit-2.24/LayoutTests/fast/text/font-face-set-destroy-document-expected.html (0 => 244018)


--- releases/WebKitGTK/webkit-2.24/LayoutTests/fast/text/font-face-set-destroy-document-expected.html	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.24/LayoutTests/fast/text/font-face-set-destroy-document-expected.html	2019-04-08 12:40:04 UTC (rev 244018)
@@ -0,0 +1,3 @@
+<html>
+This test makes sure FontFaceSets don't access deleted documents. The test passes if there is no crash when running under ASan.
+</html>

Added: releases/WebKitGTK/webkit-2.24/LayoutTests/fast/text/font-face-set-destroy-document.html (0 => 244018)


--- releases/WebKitGTK/webkit-2.24/LayoutTests/fast/text/font-face-set-destroy-document.html	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.24/LayoutTests/fast/text/font-face-set-destroy-document.html	2019-04-08 12:40:04 UTC (rev 244018)
@@ -0,0 +1,15 @@
+<html>
+This test makes sure FontFaceSets don't access deleted documents. The test passes if there is no crash when running under ASan.
+<script>
+
+d = document.implementation.createDocument(null, '');
+f = new FontFace('f', 'local(F)', {});
+ffs = d.fonts;
+delete d;
+// gc();
+GCController.collect();
+
+// trigger use after free
+ffs.add(f);
+</script>
+</html>

Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/ChangeLog (244017 => 244018)


--- releases/WebKitGTK/webkit-2.24/Source/WebCore/ChangeLog	2019-04-08 12:39:58 UTC (rev 244017)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/ChangeLog	2019-04-08 12:40:04 UTC (rev 244018)
@@ -1,3 +1,30 @@
+2019-04-03  Myles C. Maxfield  <[email protected]>
+
+        Documents can be destroyed before their CSSFontFaceSet is destroyed
+        https://bugs.webkit.org/show_bug.cgi?id=195830
+
+        Reviewed by Darin Adler.
+
+        CSSFontFaceSet has a raw pointer to its owning document. JS can keep the CSSFontFaceSet alive (by using FontFaceSet)
+        and can destroy the document at any time. When the document is destroyed, the link between the two objects needs to
+        be severed.
+
+        Test: fast/text/font-face-set-destroy-document.html
+
+        * css/CSSFontFace.cpp:
+        (WebCore::CSSFontFace::CSSFontFace):
+        * css/CSSFontFace.h:
+        * css/CSSFontFaceSet.cpp:
+        (WebCore::CSSFontFaceSet::CSSFontFaceSet):
+        (WebCore::CSSFontFaceSet::ensureLocalFontFacesForFamilyRegistered):
+        * css/CSSFontFaceSet.h:
+        * css/CSSFontSelector.cpp:
+        (WebCore::CSSFontSelector::CSSFontSelector):
+        (WebCore::CSSFontSelector::addFontFaceRule):
+        * css/CSSFontSelector.h:
+        * css/FontFace.cpp:
+        (WebCore::FontFace::FontFace):
+
 2019-04-02  Ryosuke Niwa  <[email protected]>
 
         Crash in HTMLCanvasElement::createContext2d after the element got adopted to a new document

Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontFace.h (244017 => 244018)


--- releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontFace.h	2019-04-08 12:39:58 UTC (rev 244017)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontFace.h	2019-04-08 12:40:04 UTC (rev 244018)
@@ -189,7 +189,7 @@
     FontLoadingBehavior m_loadingBehavior { FontLoadingBehavior::Auto };
 
     Vector<std::unique_ptr<CSSFontFaceSource>, 0, CrashOnOverflow, 0> m_sources;
-    RefPtr<CSSFontSelector> m_fontSelector;
+    RefPtr<CSSFontSelector> m_fontSelector; // FIXME: https://bugs.webkit.org/show_bug.cgi?id=196437 There's a retain cycle: CSSFontSelector -> CSSFontFaceSet -> CSSFontFace -> CSSFontSelector
     RefPtr<StyleRuleFontFace> m_cssConnection;
     HashSet<Client*> m_clients;
     WeakPtr<FontFace> m_wrapper;

Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontFaceSet.cpp (244017 => 244018)


--- releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontFaceSet.cpp	2019-04-08 12:39:58 UTC (rev 244017)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontFaceSet.cpp	2019-04-08 12:40:04 UTC (rev 244018)
@@ -42,7 +42,7 @@
 namespace WebCore {
 
 CSSFontFaceSet::CSSFontFaceSet(CSSFontSelector* owningFontSelector)
-    : m_owningFontSelector(owningFontSelector)
+    : m_owningFontSelector(makeWeakPtr(owningFontSelector))
 {
 }
 
@@ -113,7 +113,7 @@
 
     Vector<Ref<CSSFontFace>> faces;
     for (auto item : capabilities) {
-        Ref<CSSFontFace> face = CSSFontFace::create(m_owningFontSelector, nullptr, nullptr, true);
+        Ref<CSSFontFace> face = CSSFontFace::create(m_owningFontSelector.get(), nullptr, nullptr, true);
         
         Ref<CSSValueList> familyList = CSSValueList::createCommaSeparated();
         familyList->append(CSSValuePool::singleton().createFontFamilyValue(familyName));

Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontFaceSet.h (244017 => 244018)


--- releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontFaceSet.h	2019-04-08 12:39:58 UTC (rev 244017)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontFaceSet.h	2019-04-08 12:40:04 UTC (rev 244018)
@@ -120,7 +120,7 @@
     size_t m_facesPartitionIndex { 0 }; // All entries in m_faces before this index are CSS-connected.
     Status m_status { Status::Loaded };
     HashSet<CSSFontFaceSetClient*> m_clients;
-    CSSFontSelector* m_owningFontSelector;
+    WeakPtr<CSSFontSelector> m_owningFontSelector;
     unsigned m_activeCount { 0 };
 };
 

Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontSelector.h (244017 => 244018)


--- releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontSelector.h	2019-04-08 12:39:58 UTC (rev 244017)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/css/CSSFontSelector.h	2019-04-08 12:40:04 UTC (rev 244018)
@@ -47,7 +47,7 @@
 class Document;
 class StyleRuleFontFace;
 
-class CSSFontSelector final : public FontSelector, public CSSFontFaceSetClient {
+class CSSFontSelector final : public FontSelector, public CSSFontFaceSetClient, public CanMakeWeakPtr<CSSFontSelector> {
 public:
     static Ref<CSSFontSelector> create(Document& document)
     {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to