2009-03-12 Simon Fraser <simon.fraser@apple.com>
Reviewed by Mark Rowe
<rdar://problem/6622300>: Reproducible crash on
<http://www.editgrid.com/explore/tnc/dave/FusionChart%3A_Candlestick>
Prevent CSSStyleSheet::checkLoaded() writing to freed memory when it gets
deleted from under itself. The sheetLoaded() notification can allow scripts
to run via HTMLTokenizer::executeScriptsWaitingForStylesheets(),
which can cause the last ref to the CSSStyleSheet to be released.
* css/CSSStyleSheet.cpp:
(WebCore::CSSStyleSheet::checkLoaded):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@41662 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/css/CSSStyleSheet.cpp b/WebCore/css/CSSStyleSheet.cpp
index 47b2c81..801fe1b 100644
--- a/WebCore/css/CSSStyleSheet.cpp
+++ b/WebCore/css/CSSStyleSheet.cpp
@@ -182,6 +182,10 @@
return;
if (parent())
parent()->checkLoaded();
+
+ // Avoid |this| being deleted by scripts that run via HTMLTokenizer::executeScriptsWaitingForStylesheets().
+ // See <rdar://problem/6622300>.
+ RefPtr<CSSStyleSheet> protector(this);
m_loadCompleted = ownerNode() ? ownerNode()->sheetLoaded() : true;
}