Index: Source/WebCore/loader/DocumentThreadableLoader.cpp |
=================================================================== |
--- Source/WebCore/loader/DocumentThreadableLoader.cpp (revision 122143) |
+++ Source/WebCore/loader/DocumentThreadableLoader.cpp (working copy) |
@@ -146,7 +146,8 @@ |
void DocumentThreadableLoader::cancel() |
{ |
- if (m_client) { |
+ // Cacnel can re-enter and m_resource might be null here as a result. |
+ if (m_client && m_resource) { |
ResourceError error(errorDomainWebKitInternal, 0, m_resource->url(), "Load cancelled"); |
error.setIsCancellation(true); |
didFail(error); |
@@ -163,9 +164,13 @@ |
void DocumentThreadableLoader::clearResource() |
{ |
- if (m_resource) { |
- m_resource->removeClient(this); |
+ // Script can cancel and restart a request reentrantly within removeClient(), |
+ // which could lead to calling CachedResource::removeClient() multiple times for |
+ // this DocumentThreadableLoader. Save off a copy of m_resource and clear it to |
+ // prevent the reentrancy. |
+ if (CachedResourceHandle<CachedRawResource> resource = m_resource) { |
m_resource = 0; |
+ resource->removeClient(this); |
} |
} |