WK1 can re-enter layout during FrameView destruction and crash
authorbdakin@apple.com <bdakin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Aug 2015 22:37:22 +0000 (22:37 +0000)
committerbdakin@apple.com <bdakin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Aug 2015 22:37:22 +0000 (22:37 +0000)
https://bugs.webkit.org/show_bug.cgi?id=148237
-and corresponding-
rdar://problem/22356782

Reviewed by Zalan Bujtas.

This is a safe fix for the time being. We won't resetScrollbars() for a FrameView
that is in the PageCache because resetting scrollbars can re-enter layout for the
Frame's new FrameView, which leads to updating pages in the page cache, which
leads to a crash because we're in the process of destroying something
in the page cache. We should not be able to get into this mess at all.
* page/FrameView.cpp:
(WebCore::FrameView::~FrameView):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@188712 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/page/FrameView.cpp

index e695464..2de52a9 100644 (file)
@@ -1,3 +1,20 @@
+2015-08-20  Beth Dakin  <bdakin@apple.com>
+
+        WK1 can re-enter layout during FrameView destruction and crash
+        https://bugs.webkit.org/show_bug.cgi?id=148237
+        -and corresponding-
+        rdar://problem/22356782
+
+        Reviewed by Zalan Bujtas.
+
+        This is a safe fix for the time being. We won't resetScrollbars() for a FrameView 
+        that is in the PageCache because resetting scrollbars can re-enter layout for the 
+        Frame's new FrameView, which leads to updating pages in the page cache, which 
+        leads to a crash because we're in the process of destroying something
+        in the page cache. We should not be able to get into this mess at all.
+        * page/FrameView.cpp:
+        (WebCore::FrameView::~FrameView):
+
 2015-08-20  Chris Dumez  <cdumez@apple.com>
 
         Default value for createNodeIterator() / createTreeWalker()'s whatToShow parameter should be 0xFFFFFFFF
index 7d7353f..ad92cba 100644 (file)
@@ -267,7 +267,13 @@ FrameView::~FrameView()
         m_postLayoutTasksTimer.stop();
     
     removeFromAXObjectCache();
-    resetScrollbars();
+
+    // FIXME: This is a safe fix for rdar://problem/22356782. We won't resetScrollbars() for a FrameView that is in
+    // the PageCache because resetting scrollbars can re-enter layout for the Frame's new FrameView, which leads to
+    // updating pages in the page cache, which leads to a crash because we're in the process of destroying something
+    // in the page cache. We should not be able to get into this mess at all.
+    if (frame().view() == this)
+        resetScrollbars();
 
     // Custom scrollbars should already be destroyed at this point
     ASSERT(!horizontalScrollbar() || !horizontalScrollbar()->isCustomScrollbar());