Permalink
Browse files

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.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@200986 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information...
bfulgham@apple.com
bfulgham@apple.com committed May 17, 2016
1 parent 464f4cd commit 98845d940e30529098eea7e496af02e14301c704
View
@@ -1,3 +1,16 @@
2016-05-16 Brent Fulgham <bfulgham@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 <sbarati@apple.com>
Hook up ShadowChicken to the debugger to show tail deleted frames
@@ -0,0 +1,3 @@
This tests that WebKit does not crash when frame loads are interrupted. This test passes if it does not crash.
@@ -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 = 'resources/crash-during-iframe-load-stop.html';
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='resources/crash-during-iframe-load-stop.html'></iframe>
</body>
</html>
@@ -0,0 +1,6 @@
<html>
<script>
window.parent.stop();
window.parent.subFrameFinishedLoading();
</script>
</html>
@@ -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="crash-during-iframe-load-stop-inner.html"></iframe>
<iframe src="data:text/html, <html></html>"></iframe>
</html>
View
@@ -1,3 +1,19 @@
2016-05-16 Brent Fulgham <bfulgham@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 <dino@apple.com>
WebCoreJSBuiltinInternals won't compile if some build flags are off
@@ -1632,6 +1632,9 @@ void FrameLoader::stopAllLoaders(ClearProvisionalItemPolicy clearProvisionalItem
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::dispatchOnloadEvents()
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 @@ void FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequ
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();

1 comment on commit 98845d9

@fengzhihun

This comment has been minimized.

Show comment
Hide comment
@fengzhihun

fengzhihun Oct 18, 2016

1254687
3155

fengzhihun commented on 98845d9 Oct 18, 2016

1254687
3155

Please sign in to comment.