Skip to content
This repository has been archived by the owner on Jun 24, 2022. It is now read-only.

Commit

Permalink
heap use-after-free at WebCore::TimerBase::heapPopMin()
Browse files Browse the repository at this point in the history
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 committed May 17, 2016
1 parent 464f4cd commit 98845d9
Show file tree
Hide file tree
Showing 7 changed files with 102 additions and 0 deletions.
13 changes: 13 additions & 0 deletions LayoutTests/ChangeLog
@@ -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
Expand Down
@@ -0,0 +1,3 @@
This tests that WebKit does not crash when frame loads are interrupted. This test passes if it does not crash.


38 changes: 38 additions & 0 deletions LayoutTests/fast/frames/crash-during-iframe-load-stop.html
@@ -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>
16 changes: 16 additions & 0 deletions Source/WebCore/ChangeLog
@@ -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
Expand Down
10 changes: 10 additions & 0 deletions Source/WebCore/loader/FrameLoader.cpp
Expand Up @@ -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)
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down

1 comment on commit 98845d9

@fengzhihun
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1254687
3155

Please sign in to comment.