Title: [227449] trunk/Source/WebCore
Revision
227449
Author
[email protected]
Date
2018-01-23 14:30:39 -0800 (Tue, 23 Jan 2018)

Log Message

[Curl] CurlRequest must protect its client from disposal while it's on duty.
https://bugs.webkit.org/show_bug.cgi?id=181875

Patch by Basuke Suzuki <[email protected]> on 2018-01-23
Reviewed by Alex Christensen.

No new tests. It's covered by existing tests.

* platform/network/curl/CurlDownload.h:
* platform/network/curl/CurlRequest.cpp:
(WebCore::CurlRequest::callClient):
(WebCore::CurlRequest::didReceiveData):
(WebCore::CurlRequest::didReceiveDataFromMultipart):
(WebCore::CurlRequest::didCompleteTransfer):
(WebCore::CurlRequest::invokeDidReceiveResponse):
* platform/network/curl/CurlRequest.h:
* platform/network/curl/CurlRequestClient.h:
* platform/network/curl/ResourceHandleCurlDelegate.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (227448 => 227449)


--- trunk/Source/WebCore/ChangeLog	2018-01-23 22:30:19 UTC (rev 227448)
+++ trunk/Source/WebCore/ChangeLog	2018-01-23 22:30:39 UTC (rev 227449)
@@ -1,3 +1,23 @@
+2018-01-23  Basuke Suzuki  <[email protected]>
+
+        [Curl] CurlRequest must protect its client from disposal while it's on duty.
+        https://bugs.webkit.org/show_bug.cgi?id=181875
+
+        Reviewed by Alex Christensen.
+
+        No new tests. It's covered by existing tests.
+
+        * platform/network/curl/CurlDownload.h:
+        * platform/network/curl/CurlRequest.cpp:
+        (WebCore::CurlRequest::callClient):
+        (WebCore::CurlRequest::didReceiveData):
+        (WebCore::CurlRequest::didReceiveDataFromMultipart):
+        (WebCore::CurlRequest::didCompleteTransfer):
+        (WebCore::CurlRequest::invokeDidReceiveResponse):
+        * platform/network/curl/CurlRequest.h:
+        * platform/network/curl/CurlRequestClient.h:
+        * platform/network/curl/ResourceHandleCurlDelegate.h:
+
 2018-01-23  Commit Queue  <[email protected]>
 
         Unreviewed, rolling out r227437.

Modified: trunk/Source/WebCore/platform/network/curl/CurlDownload.h (227448 => 227449)


--- trunk/Source/WebCore/platform/network/curl/CurlDownload.h	2018-01-23 22:30:19 UTC (rev 227448)
+++ trunk/Source/WebCore/platform/network/curl/CurlDownload.h	2018-01-23 22:30:39 UTC (rev 227449)
@@ -52,6 +52,9 @@
     CurlDownload() = default;
     ~CurlDownload();
 
+    void ref() override { ThreadSafeRefCounted<CurlDownload>::ref(); }
+    void deref() override { ThreadSafeRefCounted<CurlDownload>::deref(); }
+
     void init(CurlDownloadListener&, const URL&);
     void init(CurlDownloadListener&, ResourceHandle*, const ResourceRequest&, const ResourceResponse&);
 

Modified: trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp (227448 => 227449)


--- trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp	2018-01-23 22:30:19 UTC (rev 227448)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp	2018-01-23 22:30:39 UTC (rev 227449)
@@ -142,15 +142,19 @@
 }
 
 /* `this` is protected inside this method. */
-void CurlRequest::callClient(WTF::Function<void(CurlRequestClient*)> task)
+void CurlRequest::callClient(WTF::Function<void(CurlRequestClient&)> task)
 {
     if (isMainThread()) {
-        if (CurlRequestClient* client = m_client)
-            task(client);
+        if (CurlRequestClient* client = m_client) {
+            RefPtr<CurlRequestClient> protectedClient(client);
+            task(*client);
+        }
     } else {
         callOnMainThread([protectedThis = makeRef(*this), task = WTFMove(task)]() mutable {
-            if (CurlRequestClient* client = protectedThis->m_client)
-                task(client);
+            if (CurlRequestClient* client = protectedThis->m_client) {
+                RefPtr<CurlRequestClient> protectedClient(client);
+                task(*client);
+            }
         });
     }
 }
@@ -356,9 +360,8 @@
         if (m_multipartHandle)
             m_multipartHandle->didReceiveData(buffer);
         else {
-            callClient([this, buffer = WTFMove(buffer)](CurlRequestClient* client) mutable {
-                if (client)
-                    client->curlDidReceiveBuffer(WTFMove(buffer));
+            callClient([buffer = WTFMove(buffer)](CurlRequestClient& client) mutable {
+                client.curlDidReceiveBuffer(WTFMove(buffer));
             });
         }
     }
@@ -389,9 +392,8 @@
     auto receiveBytes = buffer->size();
 
     if (receiveBytes) {
-        callClient([this, buffer = WTFMove(buffer)](CurlRequestClient* client) mutable {
-            if (client)
-                client->curlDidReceiveBuffer(WTFMove(buffer));
+        callClient([buffer = WTFMove(buffer)](CurlRequestClient& client) mutable {
+            client.curlDidReceiveBuffer(WTFMove(buffer));
         });
     }
 }
@@ -418,9 +420,8 @@
                 m_networkLoadMetrics = *metrics;
 
             finalizeTransfer();
-            callClient([this](CurlRequestClient* client) {
-                if (client)
-                    client->curlDidComplete();
+            callClient([](CurlRequestClient& client) {
+                client.curlDidComplete();
             });
         }
     } else {
@@ -430,9 +431,8 @@
             resourceError.setSslErrors(m_sslVerifier.sslErrors());
 
         finalizeTransfer();
-        callClient([this, error = resourceError.isolatedCopy()](CurlRequestClient* client) {
-            if (client)
-                client->curlDidFailWithError(error);
+        callClient([error = resourceError.isolatedCopy()](CurlRequestClient& client) {
+            client.curlDidFailWithError(error);
         });
     }
 }
@@ -531,9 +531,8 @@
     m_didNotifyResponse = true;
     m_actionAfterInvoke = behaviorAfterInvoke;
 
-    callClient([this, response = response.isolatedCopy()](CurlRequestClient* client) {
-        if (client)
-            client->curlDidReceiveResponse(response);
+    callClient([response = response.isolatedCopy()](CurlRequestClient& client) {
+        client.curlDidReceiveResponse(response);
     });
 }
 

Modified: trunk/Source/WebCore/platform/network/curl/CurlRequest.h (227448 => 227449)


--- trunk/Source/WebCore/platform/network/curl/CurlRequest.h	2018-01-23 22:30:19 UTC (rev 227448)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequest.h	2018-01-23 22:30:39 UTC (rev 227449)
@@ -102,7 +102,7 @@
 
     void startWithJobManager();
 
-    void callClient(WTF::Function<void(CurlRequestClient*)>);
+    void callClient(WTF::Function<void(CurlRequestClient&)>);
 
     // Transfer processing of Request body, Response header/body
     // Called by worker thread in case of async, main thread in case of sync.

Modified: trunk/Source/WebCore/platform/network/curl/CurlRequestClient.h (227448 => 227449)


--- trunk/Source/WebCore/platform/network/curl/CurlRequestClient.h	2018-01-23 22:30:19 UTC (rev 227448)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequestClient.h	2018-01-23 22:30:39 UTC (rev 227449)
@@ -35,6 +35,9 @@
 
 class CurlRequestClient {
 public:
+    virtual void ref() = 0;
+    virtual void deref() = 0;
+
     virtual void curlDidReceiveResponse(const CurlResponse&) = 0;
     virtual void curlDidReceiveBuffer(Ref<SharedBuffer>&&) = 0;
     virtual void curlDidComplete() = 0;

Modified: trunk/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.h (227448 => 227449)


--- trunk/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.h	2018-01-23 22:30:19 UTC (rev 227448)
+++ trunk/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.h	2018-01-23 22:30:39 UTC (rev 227449)
@@ -43,6 +43,9 @@
     ResourceHandleCurlDelegate(ResourceHandle*);
     ~ResourceHandleCurlDelegate();
 
+    void ref() override { ThreadSafeRefCounted<ResourceHandleCurlDelegate>::ref(); }
+    void deref() override { ThreadSafeRefCounted<ResourceHandleCurlDelegate>::deref(); }
+
     bool hasHandle() const;
     void releaseHandle();
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to