NetworkProcess aborts in WebKit::NetworkLoad::didCompleteWithError at Source/WebKit2...
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Mar 2017 07:34:15 +0000 (07:34 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Mar 2017 07:34:15 +0000 (07:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=168963

Reviewed by Antti Koivisto.

This is trying to call SpeculativeLoad::didFailLoading() after SpeculativeLoad has already been
completed. SpeculativeLoad::didComplete() call its completion handler that removes the load from
m_pendingPreloads. When the completion handler returns the SpeculativeLoad is deleted. So, we should always
ensure that SpeculativeLoad is not used after didComplete() call. In SpeculativeLoad::willSendRedirectedRequest(),
the call to NetworkLoad::continueWillSendRequest() causes SpeculativeLoad::didFailLoading() to be called. We
don't really need to call continueWillSendRequest() though, since the network load is going to be deleted anyway
by didComplete(), and the willSendRequest completion handler does nothing when the request is null.

* NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp:
(WebKit::NetworkCache::SpeculativeLoad::willSendRedirectedRequest):

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

Source/WebKit2/ChangeLog
Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp

index e89f71b..d115f49 100644 (file)
@@ -1,3 +1,21 @@
+2017-02-28  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        NetworkProcess aborts in WebKit::NetworkLoad::didCompleteWithError at Source/WebKit2/NetworkProcess/NetworkLoad.cpp:423
+        https://bugs.webkit.org/show_bug.cgi?id=168963
+
+        Reviewed by Antti Koivisto.
+
+        This is trying to call SpeculativeLoad::didFailLoading() after SpeculativeLoad has already been
+        completed. SpeculativeLoad::didComplete() call its completion handler that removes the load from
+        m_pendingPreloads. When the completion handler returns the SpeculativeLoad is deleted. So, we should always
+        ensure that SpeculativeLoad is not used after didComplete() call. In SpeculativeLoad::willSendRedirectedRequest(),
+        the call to NetworkLoad::continueWillSendRequest() causes SpeculativeLoad::didFailLoading() to be called. We
+        don't really need to call continueWillSendRequest() though, since the network load is going to be deleted anyway
+        by didComplete(), and the willSendRequest completion handler does nothing when the request is null.
+
+        * NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp:
+        (WebKit::NetworkCache::SpeculativeLoad::willSendRedirectedRequest):
+
 2017-02-28  Alexey Proskuryakov  <ap@apple.com>
 
         https://bugs.webkit.org/show_bug.cgi?id=168899
index dc060e7..b93868c 100644 (file)
@@ -76,14 +76,8 @@ void SpeculativeLoad::willSendRedirectedRequest(ResourceRequest&& request, Resou
     if (!m_cacheEntry)
         m_cacheEntry = NetworkCache::singleton().makeRedirectEntry(request, redirectResponse, redirectRequest);
 
-    auto load = WTFMove(m_networkLoad);
-
     // Don't follow the redirect. The redirect target will be registered for speculative load when it is loaded.
     didComplete();
-
-    // This causes call to didFailLoading().
-    if (load)
-        load->continueWillSendRequest({ });
 }
 
 auto SpeculativeLoad::didReceiveResponse(ResourceResponse&& receivedResponse) -> ShouldContinueDidReceiveResponse