Changeset 227449 in webkit


Ignore:
Timestamp:
Jan 23, 2018 2:30:39 PM (6 years ago)
Author:
commit-queue@webkit.org
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 <Basuke Suzuki> 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:
Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r227442 r227449  
     12018-01-23  Basuke Suzuki  <Basuke.Suzuki@sony.com>
     2
     3        [Curl] CurlRequest must protect its client from disposal while it's on duty.
     4        https://bugs.webkit.org/show_bug.cgi?id=181875
     5
     6        Reviewed by Alex Christensen.
     7
     8        No new tests. It's covered by existing tests.
     9
     10        * platform/network/curl/CurlDownload.h:
     11        * platform/network/curl/CurlRequest.cpp:
     12        (WebCore::CurlRequest::callClient):
     13        (WebCore::CurlRequest::didReceiveData):
     14        (WebCore::CurlRequest::didReceiveDataFromMultipart):
     15        (WebCore::CurlRequest::didCompleteTransfer):
     16        (WebCore::CurlRequest::invokeDidReceiveResponse):
     17        * platform/network/curl/CurlRequest.h:
     18        * platform/network/curl/CurlRequestClient.h:
     19        * platform/network/curl/ResourceHandleCurlDelegate.h:
     20
    1212018-01-23  Commit Queue  <commit-queue@webkit.org>
    222
  • trunk/Source/WebCore/platform/network/curl/CurlDownload.h

    r225998 r227449  
    5353    ~CurlDownload();
    5454
     55    void ref() override { ThreadSafeRefCounted<CurlDownload>::ref(); }
     56    void deref() override { ThreadSafeRefCounted<CurlDownload>::deref(); }
     57
    5558    void init(CurlDownloadListener&, const URL&);
    5659    void init(CurlDownloadListener&, ResourceHandle*, const ResourceRequest&, const ResourceResponse&);
  • trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp

    r227237 r227449  
    143143
    144144/* `this` is protected inside this method. */
    145 void CurlRequest::callClient(WTF::Function<void(CurlRequestClient*)> task)
     145void CurlRequest::callClient(WTF::Function<void(CurlRequestClient&)> task)
    146146{
    147147    if (isMainThread()) {
    148         if (CurlRequestClient* client = m_client)
    149             task(client);
     148        if (CurlRequestClient* client = m_client) {
     149            RefPtr<CurlRequestClient> protectedClient(client);
     150            task(*client);
     151        }
    150152    } else {
    151153        callOnMainThread([protectedThis = makeRef(*this), task = WTFMove(task)]() mutable {
    152             if (CurlRequestClient* client = protectedThis->m_client)
    153                 task(client);
     154            if (CurlRequestClient* client = protectedThis->m_client) {
     155                RefPtr<CurlRequestClient> protectedClient(client);
     156                task(*client);
     157            }
    154158        });
    155159    }
     
    357361            m_multipartHandle->didReceiveData(buffer);
    358362        else {
    359             callClient([this, buffer = WTFMove(buffer)](CurlRequestClient* client) mutable {
    360                 if (client)
    361                     client->curlDidReceiveBuffer(WTFMove(buffer));
     363            callClient([buffer = WTFMove(buffer)](CurlRequestClient& client) mutable {
     364                client.curlDidReceiveBuffer(WTFMove(buffer));
    362365            });
    363366        }
     
    390393
    391394    if (receiveBytes) {
    392         callClient([this, buffer = WTFMove(buffer)](CurlRequestClient* client) mutable {
    393             if (client)
    394                 client->curlDidReceiveBuffer(WTFMove(buffer));
     395        callClient([buffer = WTFMove(buffer)](CurlRequestClient& client) mutable {
     396            client.curlDidReceiveBuffer(WTFMove(buffer));
    395397        });
    396398    }
     
    419421
    420422            finalizeTransfer();
    421             callClient([this](CurlRequestClient* client) {
    422                 if (client)
    423                     client->curlDidComplete();
     423            callClient([](CurlRequestClient& client) {
     424                client.curlDidComplete();
    424425            });
    425426        }
     
    431432
    432433        finalizeTransfer();
    433         callClient([this, error = resourceError.isolatedCopy()](CurlRequestClient* client) {
    434             if (client)
    435                 client->curlDidFailWithError(error);
     434        callClient([error = resourceError.isolatedCopy()](CurlRequestClient& client) {
     435            client.curlDidFailWithError(error);
    436436        });
    437437    }
     
    532532    m_actionAfterInvoke = behaviorAfterInvoke;
    533533
    534     callClient([this, response = response.isolatedCopy()](CurlRequestClient* client) {
    535         if (client)
    536             client->curlDidReceiveResponse(response);
     534    callClient([response = response.isolatedCopy()](CurlRequestClient& client) {
     535        client.curlDidReceiveResponse(response);
    537536    });
    538537}
  • trunk/Source/WebCore/platform/network/curl/CurlRequest.h

    r226800 r227449  
    103103    void startWithJobManager();
    104104
    105     void callClient(WTF::Function<void(CurlRequestClient*)>);
     105    void callClient(WTF::Function<void(CurlRequestClient&)>);
    106106
    107107    // Transfer processing of Request body, Response header/body
  • trunk/Source/WebCore/platform/network/curl/CurlRequestClient.h

    r224037 r227449  
    3636class CurlRequestClient {
    3737public:
     38    virtual void ref() = 0;
     39    virtual void deref() = 0;
     40
    3841    virtual void curlDidReceiveResponse(const CurlResponse&) = 0;
    3942    virtual void curlDidReceiveBuffer(Ref<SharedBuffer>&&) = 0;
  • trunk/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.h

    r226800 r227449  
    4343    ResourceHandleCurlDelegate(ResourceHandle*);
    4444    ~ResourceHandleCurlDelegate();
     45
     46    void ref() override { ThreadSafeRefCounted<ResourceHandleCurlDelegate>::ref(); }
     47    void deref() override { ThreadSafeRefCounted<ResourceHandleCurlDelegate>::deref(); }
    4548
    4649    bool hasHandle() const;
Note: See TracChangeset for help on using the changeset viewer.