Diff
Modified: branches/safari-601.1.46-branch/LayoutTests/ChangeLog (200998 => 200999)
--- branches/safari-601.1.46-branch/LayoutTests/ChangeLog 2016-05-17 05:35:38 UTC (rev 200998)
+++ branches/safari-601.1.46-branch/LayoutTests/ChangeLog 2016-05-17 05:37:51 UTC (rev 200999)
@@ -1,3 +1,20 @@
+2016-05-16 Babak Shafiei <bshaf...@apple.com>
+
+ Merge r200986.
+
+ 2016-05-16 Brent Fulgham <bfulg...@apple.com>
+
+ heap use-after-free at WebCore::TimerBase::heapPopMin()
+ https://bugs.webkit.org/show_bug.cgi?id=157742
+ <rdar://problem/26236778>
+
+ Reviewed by Simon Fraser.
+
+ * fast/frames/crash-during-iframe-load-stop-expected.txt: Added.
+ * fast/frames/crash-during-iframe-load-stop.html: Added.
+ * fast/frames/resources/crash-during-iframe-load-stop-inner.html: Added.
+ * fast/frames/resources/crash-during-iframe-load-stop.html: Added.
+
2016-05-12 Matthew Hanson <matthew_han...@apple.com>
Merge r200378. rdar://problem/26064990
Copied: branches/safari-601.1.46-branch/LayoutTests/fast/frames/crash-during-iframe-load-stop-expected.txt (from rev 200986, trunk/LayoutTests/fast/frames/crash-during-iframe-load-stop-expected.txt) (0 => 200999)
--- branches/safari-601.1.46-branch/LayoutTests/fast/frames/crash-during-iframe-load-stop-expected.txt (rev 0)
+++ branches/safari-601.1.46-branch/LayoutTests/fast/frames/crash-during-iframe-load-stop-expected.txt 2016-05-17 05:37:51 UTC (rev 200999)
@@ -0,0 +1,3 @@
+This tests that WebKit does not crash when frame loads are interrupted. This test passes if it does not crash.
+
+
Copied: branches/safari-601.1.46-branch/LayoutTests/fast/frames/crash-during-iframe-load-stop.html (from rev 200986, trunk/LayoutTests/fast/frames/crash-during-iframe-load-stop.html) (0 => 200999)
--- branches/safari-601.1.46-branch/LayoutTests/fast/frames/crash-during-iframe-load-stop.html (rev 0)
+++ branches/safari-601.1.46-branch/LayoutTests/fast/frames/crash-during-iframe-load-stop.html 2016-05-17 05:37:51 UTC (rev 200999)
@@ -0,0 +1,38 @@
+<html>
+<head>
+<script>
+ if (window.testRunner) {
+ testRunner.waitUntilDone();
+ testRunner.dumpAsText();
+ }
+
+ var count = 0;
+</script>
+</head>
+<body _onload_='deleteFrame()'>
+ <script>
+ function deleteFrame()
+ {
+ var frameToRemove = document.getElementById('subframe');
+ document.body.removeChild(frameToRemove);
+ }
+
+ function reloadSubframe()
+ {
+ var iframe = document.createElement('iframe');
+ iframe.id = 'subframe';
+ iframe.src = '';
+ document.body.appendChild(iframe);
+ setTimeout(function() { deleteFrame(); }, 0);
+ }
+
+ function subFrameFinishedLoading()
+ {
+ if (window.testRunner)
+ testRunner.notifyDone();
+ }
+ </script>
+ <p>This tests that WebKit does not crash when frame loads are interrupted. This test passes if it does not crash.</p>
+ <iframe id="subframe" src=''></iframe>
+</body>
+</html>
\ No newline at end of file
Copied: branches/safari-601.1.46-branch/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop-inner.html (from rev 200986, trunk/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop-inner.html) (0 => 200999)
--- branches/safari-601.1.46-branch/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop-inner.html (rev 0)
+++ branches/safari-601.1.46-branch/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop-inner.html 2016-05-17 05:37:51 UTC (rev 200999)
@@ -0,0 +1,6 @@
+<html>
+ <script>
+ window.parent.stop();
+ window.parent.subFrameFinishedLoading();
+ </script>
+</html>
\ No newline at end of file
Copied: branches/safari-601.1.46-branch/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop.html (from rev 200986, trunk/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop.html) (0 => 200999)
--- branches/safari-601.1.46-branch/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop.html (rev 0)
+++ branches/safari-601.1.46-branch/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop.html 2016-05-17 05:37:51 UTC (rev 200999)
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <script>
+ function subFrameFinishedLoading()
+ {
+ window.parent.count = window.parent.count + 1;
+ if (window.parent.count < 10)
+ window.parent.reloadSubframe();
+ else
+ window.parent.subFrameFinishedLoading();
+ }
+ </script>
+</head>
+ <iframe src=""
+ <iframe src="" <html></html>"></iframe>
+</html>
\ No newline at end of file
Modified: branches/safari-601.1.46-branch/Source/WebCore/ChangeLog (200998 => 200999)
--- branches/safari-601.1.46-branch/Source/WebCore/ChangeLog 2016-05-17 05:35:38 UTC (rev 200998)
+++ branches/safari-601.1.46-branch/Source/WebCore/ChangeLog 2016-05-17 05:37:51 UTC (rev 200999)
@@ -1,3 +1,23 @@
+2016-05-16 Babak Shafiei <bshaf...@apple.com>
+
+ Merge r200986.
+
+ 2016-05-16 Brent Fulgham <bfulg...@apple.com>
+
+ heap use-after-free at WebCore::TimerBase::heapPopMin()
+ https://bugs.webkit.org/show_bug.cgi?id=157742
+ <rdar://problem/26236778>
+
+ Reviewed by David Kilzer.
+
+ Tested by fast/frames/resources/crash-during-iframe-load-stop.html.
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::stopForUserCancel): Protect m_frame from destruction while it is still
+ being used by the current stack frame.
+ (WebCore::FrameLoader::frameDetached): Ditto.
+ (WebCore::FrameLoader::continueFragmentScrollAfterNavigationPolicy): Ditto.
+
2016-05-12 Babak Shafiei <bshaf...@apple.com>
Merge r200466.
Modified: branches/safari-601.1.46-branch/Source/WebCore/loader/FrameLoader.cpp (200998 => 200999)
--- branches/safari-601.1.46-branch/Source/WebCore/loader/FrameLoader.cpp 2016-05-17 05:35:38 UTC (rev 200998)
+++ branches/safari-601.1.46-branch/Source/WebCore/loader/FrameLoader.cpp 2016-05-17 05:37:51 UTC (rev 200999)
@@ -1649,6 +1649,9 @@
void FrameLoader::stopForUserCancel(bool deferCheckLoadComplete)
{
+ // Calling stopAllLoaders can cause the frame to be deallocated, including the frame loader.
+ Ref<Frame> protectedFrame(m_frame);
+
stopAllLoaders();
#if PLATFORM(IOS)
@@ -2502,6 +2505,9 @@
void FrameLoader::frameDetached()
{
+ // Calling stopAllLoaders can cause the frame to be deallocated, including the frame loader.
+ Ref<Frame> protectedFrame(m_frame);
+
stopAllLoaders();
m_frame.document()->stopActiveDOMObjects();
detachFromParent();
@@ -2797,6 +2803,10 @@
if (!shouldContinue)
return;
+ // Calling stopLoading() on the provisional document loader can cause the underlying
+ // frame to be deallocated.
+ Ref<Frame> protectedFrame(m_frame);
+
// If we have a provisional request for a different document, a fragment scroll should cancel it.
if (m_provisionalDocumentLoader && !equalIgnoringFragmentIdentifier(m_provisionalDocumentLoader->request().url(), request.url())) {
m_provisionalDocumentLoader->stopLoading();