Title: [200986] trunk
- Revision
- 200986
- Author
- bfulg...@apple.com
- Date
- 2016-05-16 18:09:27 -0700 (Mon, 16 May 2016)
Log Message
heap use-after-free at WebCore::TimerBase::heapPopMin()
https://bugs.webkit.org/show_bug.cgi?id=157742
<rdar://problem/26236778>
Source/WebCore:
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.
LayoutTests:
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.
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (200985 => 200986)
--- trunk/LayoutTests/ChangeLog 2016-05-17 01:05:41 UTC (rev 200985)
+++ trunk/LayoutTests/ChangeLog 2016-05-17 01:09:27 UTC (rev 200986)
@@ -1,3 +1,16 @@
+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-16 Saam barati <sbar...@apple.com>
Hook up ShadowChicken to the debugger to show tail deleted frames
Added: trunk/LayoutTests/fast/frames/crash-during-iframe-load-stop-expected.txt (0 => 200986)
--- trunk/LayoutTests/fast/frames/crash-during-iframe-load-stop-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/frames/crash-during-iframe-load-stop-expected.txt 2016-05-17 01:09:27 UTC (rev 200986)
@@ -0,0 +1,3 @@
+This tests that WebKit does not crash when frame loads are interrupted. This test passes if it does not crash.
+
+
Added: trunk/LayoutTests/fast/frames/crash-during-iframe-load-stop.html (0 => 200986)
--- trunk/LayoutTests/fast/frames/crash-during-iframe-load-stop.html (rev 0)
+++ trunk/LayoutTests/fast/frames/crash-during-iframe-load-stop.html 2016-05-17 01:09:27 UTC (rev 200986)
@@ -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
Added: trunk/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop-inner.html (0 => 200986)
--- trunk/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop-inner.html (rev 0)
+++ trunk/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop-inner.html 2016-05-17 01:09:27 UTC (rev 200986)
@@ -0,0 +1,6 @@
+<html>
+ <script>
+ window.parent.stop();
+ window.parent.subFrameFinishedLoading();
+ </script>
+</html>
\ No newline at end of file
Added: trunk/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop.html (0 => 200986)
--- trunk/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop.html (rev 0)
+++ trunk/LayoutTests/fast/frames/resources/crash-during-iframe-load-stop.html 2016-05-17 01:09:27 UTC (rev 200986)
@@ -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: trunk/Source/WebCore/ChangeLog (200985 => 200986)
--- trunk/Source/WebCore/ChangeLog 2016-05-17 01:05:41 UTC (rev 200985)
+++ trunk/Source/WebCore/ChangeLog 2016-05-17 01:09:27 UTC (rev 200986)
@@ -1,3 +1,19 @@
+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-16 Dean Jackson <d...@apple.com>
WebCoreJSBuiltinInternals won't compile if some build flags are off
Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (200985 => 200986)
--- trunk/Source/WebCore/loader/FrameLoader.cpp 2016-05-17 01:05:41 UTC (rev 200985)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp 2016-05-17 01:09:27 UTC (rev 200986)
@@ -1632,6 +1632,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)
@@ -2491,6 +2494,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();
@@ -2790,6 +2796,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();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes