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();