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;
 }