2008-10-09 Brady Eidson <beidson@apple.com>
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 9 Oct 2008 20:43:24 +0000 (20:43 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 9 Oct 2008 20:43:24 +0000 (20:43 +0000)
        Reviewed by Anders

        <rdar://problem/6250856> - Calling [WebView close] from within a redirection callback can cause bad things

        The API usage to reveal this crash was so particular that a layout test is not possible with our current infrastructure.

        * loader/FrameLoader.cpp:
        (WebCore::FrameLoader::changeLocation): Protect the Frame from deletion
        (WebCore::FrameLoader::continueLoadAfterNavigationPolicy): stopAllLoaders() might clear the Frame's page,
          so perform a second null check on the page.  Bail if it has been cleared.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@37449 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/loader/FrameLoader.cpp

index 5304543027c0742584a1b54e0e04c6eb36ea8b3a..47a29c03be000d8d56f3569cb97e37e70404b66c 100644 (file)
@@ -1,3 +1,16 @@
+2008-10-09  Brady Eidson  <beidson@apple.com>
+
+        Reviewed by Anders
+
+        <rdar://problem/6250856> - Calling [WebView close] from within a redirection callback can cause bad things
+
+        The API usage to reveal this crash was so particular that a layout test is not possible with our current infrastructure.
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::changeLocation): Protect the Frame from deletion
+        (WebCore::FrameLoader::continueLoadAfterNavigationPolicy): stopAllLoaders() might clear the Frame's page,
+          so perform a second null check on the page.  Bail if it has been cleared.
+
 2008-10-09  Alp Toker  <alp@nuanti.com>
 
         Build fix for recent DOM generation Makefile changes when custom
index b993f692c624f6d23f28fc5091e7f1aba307d7cd..1887f87c2d58bcf7db5676f39f7bf562fff4374e 100644 (file)
@@ -385,6 +385,8 @@ void FrameLoader::changeLocation(const String& url, const String& referrer, bool
 
 void FrameLoader::changeLocation(const KURL& url, const String& referrer, bool lockHistory, bool userGesture)
 {
+    RefPtr<Frame> protect(m_frame);
+
     ResourceRequestCachePolicy policy = (m_cachePolicy == CachePolicyReload) || (m_cachePolicy == CachePolicyRefresh)
         ? ReloadIgnoringCacheData : UseProtocolCachePolicy;
     ResourceRequest request(url, referrer, policy);
@@ -3877,6 +3879,12 @@ void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest& reque
 
     FrameLoadType type = m_policyLoadType;
     stopAllLoaders();
+    
+    // <rdar://problem/6250856> - In certain circumstances on pages with multiple frames, stopAllLoaders()
+    // might detach the current FrameLoader, in which case we should bail on this newly defunct load. 
+    if (!m_frame->page())
+        return;
+        
     setProvisionalDocumentLoader(m_policyDocumentLoader.get());
     m_loadType = type;
     setState(FrameStateProvisional);