Regression(r119759): Heap-use-after-free in webkit_glue::WebURLLoaderImpl::Context...
authorgavinp@chromium.org <gavinp@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 12 Jan 2013 18:05:19 +0000 (18:05 +0000)
committergavinp@chromium.org <gavinp@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 12 Jan 2013 18:05:19 +0000 (18:05 +0000)
https://bugs.webkit.org/show_bug.cgi?id=103563

A subresource could receive a body on a 404 if its call to CachedResource::error() resulted in a nested message loop.
That caused a crash when data was received, as the Subresource was in the Finished state already. Now when receiving
data we ignore these bodies, avoiding the crash.

Reviewed by Nate Chapin.

No new tests in WebKit, since it required a nested message loop which isn't present in chromium DumpRender tree.
There's a Chrome side browser test, see https://codereview.chromium.org/11778083/

* loader/SubresourceLoader.cpp:
(WebCore::SubresourceLoader::checkForHTTPStatusCodeError):

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

Source/WebCore/ChangeLog
Source/WebCore/loader/SubresourceLoader.cpp

index 13b1c9a..81fb232 100644 (file)
@@ -1,3 +1,20 @@
+2013-01-12  Gavin Peters  <gavinp@chromium.org>
+
+        Regression(r119759): Heap-use-after-free in webkit_glue::WebURLLoaderImpl::Context::OnReceivedResponse
+        https://bugs.webkit.org/show_bug.cgi?id=103563
+
+        A subresource could receive a body on a 404 if its call to CachedResource::error() resulted in a nested message loop.
+        That caused a crash when data was received, as the Subresource was in the Finished state already. Now when receiving
+        data we ignore these bodies, avoiding the crash.
+
+        Reviewed by Nate Chapin.
+
+        No new tests in WebKit, since it required a nested message loop which isn't present in chromium DumpRender tree.
+        There's a Chrome side browser test, see https://codereview.chromium.org/11778083/
+
+        * loader/SubresourceLoader.cpp:
+        (WebCore::SubresourceLoader::checkForHTTPStatusCodeError):
+
 2013-01-12  Robert Hogan  <robert@webkit.org>
 
         Available height should respect min and max height
index b06af6c..08df75e 100644 (file)
@@ -214,6 +214,8 @@ void SubresourceLoader::didReceiveResponse(const ResourceResponse& response)
 
 void SubresourceLoader::didReceiveData(const char* data, int length, long long encodedDataLength, bool allAtOnce)
 {
+    if (m_resource->response().httpStatusCode() >= 400 && !m_resource->shouldIgnoreHTTPStatusCodeErrors())
+        return;
     ASSERT(!m_resource->resourceToRevalidate());
     ASSERT(!m_resource->errorOccurred());
     ASSERT(m_state == Initialized);
@@ -232,8 +234,8 @@ bool SubresourceLoader::checkForHTTPStatusCodeError()
     if (m_resource->response().httpStatusCode() < 400 || m_resource->shouldIgnoreHTTPStatusCodeErrors())
         return false;
 
-    m_resource->error(CachedResource::LoadError);
     m_state = Finishing;
+    m_resource->error(CachedResource::LoadError);
     cancel();
     return true;
 }