Changeset 194337 in webkit


Ignore:
Timestamp:
Dec 21, 2015 11:54:46 AM (8 years ago)
Author:
Antti Koivisto
Message:

Limit cached redirect chain length
https://bugs.webkit.org/show_bug.cgi?id=152477

Reviewed by Andreas Kling.

Source/WebKit2:

Networking layer prevents cycles and limits the redirect chain length so creating cache cycles is difficult.
For robustness the network cache should still limit the maximum redirect chain length.

This patch adds a limit of five redirects both when storing and retrieving cache entries.

  • NetworkProcess/NetworkResourceLoader.cpp:

(WebKit::NetworkResourceLoader::canUseCache):
(WebKit::NetworkResourceLoader::canUseCachedRedirect):
(WebKit::NetworkResourceLoader::willSendRedirectedRequest):
(WebKit::NetworkResourceLoader::continueWillSendRequest):
(WebKit::NetworkResourceLoader::dispatchWillSendRequestForCacheEntry):

  • NetworkProcess/NetworkResourceLoader.h:

LayoutTests:

  • http/tests/cache/disk-cache/redirect-chain-limits-expected.txt: Added.
  • http/tests/cache/disk-cache/redirect-chain-limits.html: Added.
  • http/tests/cache/disk-cache/resources/redirect-chain.phpl: Added.
Location:
trunk
Files:
3 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r194336 r194337  
     12015-12-21  Antti Koivisto  <antti@apple.com>
     2
     3        Limit cached redirect chain length
     4        https://bugs.webkit.org/show_bug.cgi?id=152477
     5
     6        Reviewed by Andreas Kling.
     7
     8        * http/tests/cache/disk-cache/redirect-chain-limits-expected.txt: Added.
     9        * http/tests/cache/disk-cache/redirect-chain-limits.html: Added.
     10        * http/tests/cache/disk-cache/resources/redirect-chain.phpl: Added.
     11
    1122015-12-21  Ryan Haddad  <ryanhaddad@apple.com>
    213
  • trunk/Source/WebKit2/ChangeLog

    r194330 r194337  
     12015-12-21  Antti Koivisto  <antti@apple.com>
     2
     3        Limit cached redirect chain length
     4        https://bugs.webkit.org/show_bug.cgi?id=152477
     5
     6        Reviewed by Andreas Kling.
     7
     8        Networking layer prevents cycles and limits the redirect chain length so creating cache cycles is difficult.
     9        For robustness the network cache should still limit the maximum redirect chain length.
     10
     11        This patch adds a limit of five redirects both when storing and retrieving cache entries.
     12
     13        * NetworkProcess/NetworkResourceLoader.cpp:
     14        (WebKit::NetworkResourceLoader::canUseCache):
     15        (WebKit::NetworkResourceLoader::canUseCachedRedirect):
     16        (WebKit::NetworkResourceLoader::willSendRedirectedRequest):
     17        (WebKit::NetworkResourceLoader::continueWillSendRequest):
     18        (WebKit::NetworkResourceLoader::dispatchWillSendRequestForCacheEntry):
     19        * NetworkProcess/NetworkResourceLoader.h:
     20
    1212015-12-21  Dan Bernstein  <mitz@apple.com>
    222
  • trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp

    r194313 r194337  
    117117    if (!request.url().protocolIsInHTTPFamily())
    118118        return false;
     119
     120    return true;
     121}
     122
     123bool NetworkResourceLoader::canUseCachedRedirect(const ResourceRequest& request) const
     124{
     125    if (!canUseCache(request))
     126        return false;
     127    // Limit cached redirects to avoid cycles and other trouble.
     128    // Networking layer follows over 30 redirects but caching that many seems unnecessary.
     129    static const unsigned maximumCachedRedirectCount { 5 };
     130    if (m_redirectCount > maximumCachedRedirectCount)
     131        return false;
     132
    119133    return true;
    120134}
     
    385399void NetworkResourceLoader::willSendRedirectedRequest(const ResourceRequest& request, const WebCore::ResourceRequest& redirectRequest, const ResourceResponse& redirectResponse)
    386400{
     401    ++m_redirectCount;
     402
    387403    if (isSynchronous()) {
    388404        ResourceRequest overridenRequest = redirectRequest;
     
    401417
    402418#if ENABLE(NETWORK_CACHE)
    403     if (canUseCache(request))
     419    if (canUseCachedRedirect(request))
    404420        NetworkCache::singleton().storeRedirect(request, redirectResponse, redirectRequest);
    405421#else
     
    413429    if (m_isWaitingContinueWillSendRequestForCachedRedirect) {
    414430        LOG(NetworkCache, "(NetworkProcess) Retrieving cached redirect");
    415         if (canUseCache(newRequest))
     431
     432        if (canUseCachedRedirect(newRequest))
    416433            retrieveCacheEntry(newRequest);
    417434        else
     
    536553    LOG(NetworkCache, "(NetworkProcess) Executing cached redirect");
    537554
     555    ++m_redirectCount;
    538556    sendAbortingOnFailure(Messages::WebResourceLoader::WillSendRequest(*entry->redirectRequest(), entry->response()));
    539557    m_isWaitingContinueWillSendRequestForCachedRedirect = true;
  • trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h

    r194313 r194337  
    6262    NetworkLoad* networkLoad() const { return m_networkLoad.get(); }
    6363
    64 #if ENABLE(NETWORK_CACHE)
    65     bool canUseCache(const WebCore::ResourceRequest&) const;
    66 #endif
    67 
    6864    void start();
    6965    void abort();
     
    117113
    118114#if ENABLE(NETWORK_CACHE)
     115    bool canUseCache(const WebCore::ResourceRequest&) const;
     116    bool canUseCachedRedirect(const WebCore::ResourceRequest&) const;
     117
    119118    void retrieveCacheEntry(const WebCore::ResourceRequest&);
    120119    void didRetrieveCacheEntry(std::unique_ptr<NetworkCache::Entry>);
     
    150149    size_t m_bufferedDataEncodedDataLength { 0 };
    151150    RefPtr<WebCore::SharedBuffer> m_bufferedData;
     151    unsigned m_redirectCount { 0 };
    152152
    153153    std::unique_ptr<SynchronousLoadData> m_synchronousLoadData;
Note: See TracChangeset for help on using the changeset viewer.