Changeset 163242 in webkit


Ignore:
Timestamp:
Feb 1, 2014 8:32:11 AM (10 years ago)
Author:
ddkilzer@apple.com
Message:

Add security-checked casts for all WebCore::CachedResource subclasses
<http://webkit.org/b/127988>

Reviewed by Darin Adler.

  • inspector/InspectorPageAgent.cpp:

(WebCore::InspectorPageAgent::cachedResourceContent):

  • inspector/InspectorResourceAgent.cpp:

(WebCore::InspectorResourceAgent::didLoadResourceFromMemoryCache):

  • Switch from static_cast<>() to security-checked cast.
  • loader/cache/CachedCSSStyleSheet.h:

(WebCore::toCachedCSSStyleSheet): Add.

  • loader/cache/CachedFont.h:

(WebCore::toCachedFont): Add.

  • loader/cache/CachedImage.h: Make CachedImageManual final.
  • loader/cache/CachedRawResource.cpp:

(WebCore::CachedRawResource::CachedRawResource): Add assert that
only MainResource or RawResource types are used to construct a
CachedRawResource. This may be a security issue depending on
what code exists that uses the type() value to cast to a
CachedResource subclass.
(WebCore::CachedRawResource::switchClientsToRevalidatedResource):
Switch from static_cast<>() to toCachedRawResource().

  • loader/cache/CachedRawResource.h:

(WebCore::toCachedRawResource): Add.

  • loader/cache/CachedResource.h:

(WebCore::CachedResource::isMainOrRawResource): Add. A
CachedRawResource could be either a MainResource or a
RawResource. Currently only used in assertions.

  • loader/cache/CachedResourceLoader.cpp:

(WebCore::CachedResourceLoader::requestFont):
(WebCore::CachedResourceLoader::requestTextTrack):
(WebCore::CachedResourceLoader::requestCSSStyleSheet):
(WebCore::CachedResourceLoader::requestUserCSSStyleSheet):
(WebCore::CachedResourceLoader::requestScript):
(WebCore::CachedResourceLoader::requestXSLStyleSheet):
(WebCore::CachedResourceLoader::requestSVGDocument):
(WebCore::CachedResourceLoader::requestRawResource):
(WebCore::CachedResourceLoader::requestMainResource):

  • Switch from static_cast<>() to security-checked cast.
  • loader/cache/CachedSVGDocument.h:

(WebCore::toCachedSVGDocument): Add.

  • loader/cache/CachedScript.h:

(WebCore::toCachedScript): Add.

  • loader/cache/CachedTextTrack.h:

(WebCore::toCachedTextTrack): Add.

  • loader/cache/CachedXSLStyleSheet.h:

(WebCore::toCachedXSLStyleSheet): Add.

Location:
trunk/Source/WebCore
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r163240 r163242  
     12014-02-01  David Kilzer  <ddkilzer@apple.com>
     2
     3        Add security-checked casts for all WebCore::CachedResource subclasses
     4        <http://webkit.org/b/127988>
     5
     6        Reviewed by Darin Adler.
     7
     8        * inspector/InspectorPageAgent.cpp:
     9        (WebCore::InspectorPageAgent::cachedResourceContent):
     10        * inspector/InspectorResourceAgent.cpp:
     11        (WebCore::InspectorResourceAgent::didLoadResourceFromMemoryCache):
     12        - Switch from static_cast<>() to security-checked cast.
     13
     14        * loader/cache/CachedCSSStyleSheet.h:
     15        (WebCore::toCachedCSSStyleSheet): Add.
     16        * loader/cache/CachedFont.h:
     17        (WebCore::toCachedFont): Add.
     18
     19        * loader/cache/CachedImage.h: Make CachedImageManual final.
     20
     21        * loader/cache/CachedRawResource.cpp:
     22        (WebCore::CachedRawResource::CachedRawResource): Add assert that
     23        only MainResource or RawResource types are used to construct a
     24        CachedRawResource.  This may be a security issue depending on
     25        what code exists that uses the type() value to cast to a
     26        CachedResource subclass.
     27        (WebCore::CachedRawResource::switchClientsToRevalidatedResource):
     28        Switch from static_cast<>() to toCachedRawResource().
     29
     30        * loader/cache/CachedRawResource.h:
     31        (WebCore::toCachedRawResource): Add.
     32        * loader/cache/CachedResource.h:
     33        (WebCore::CachedResource::isMainOrRawResource): Add.  A
     34        CachedRawResource could be either a MainResource or a
     35        RawResource.  Currently only used in assertions.
     36
     37        * loader/cache/CachedResourceLoader.cpp:
     38        (WebCore::CachedResourceLoader::requestFont):
     39        (WebCore::CachedResourceLoader::requestTextTrack):
     40        (WebCore::CachedResourceLoader::requestCSSStyleSheet):
     41        (WebCore::CachedResourceLoader::requestUserCSSStyleSheet):
     42        (WebCore::CachedResourceLoader::requestScript):
     43        (WebCore::CachedResourceLoader::requestXSLStyleSheet):
     44        (WebCore::CachedResourceLoader::requestSVGDocument):
     45        (WebCore::CachedResourceLoader::requestRawResource):
     46        (WebCore::CachedResourceLoader::requestMainResource):
     47        - Switch from static_cast<>() to security-checked cast.
     48
     49        * loader/cache/CachedSVGDocument.h:
     50        (WebCore::toCachedSVGDocument): Add.
     51        * loader/cache/CachedScript.h:
     52        (WebCore::toCachedScript): Add.
     53        * loader/cache/CachedTextTrack.h:
     54        (WebCore::toCachedTextTrack): Add.
     55        * loader/cache/CachedXSLStyleSheet.h:
     56        (WebCore::toCachedXSLStyleSheet): Add.
     57
    1582014-02-01  Xabier Rodriguez Calvar  <calvaris@igalia.com>
    259
  • trunk/Source/WebCore/inspector/InspectorPageAgent.cpp

    r162692 r163242  
    175175        switch (cachedResource->type()) {
    176176        case CachedResource::CSSStyleSheet:
    177             *result = static_cast<CachedCSSStyleSheet*>(cachedResource)->sheetText(false);
     177            *result = toCachedCSSStyleSheet(cachedResource)->sheetText(false);
    178178            return true;
    179179        case CachedResource::Script:
    180             *result = static_cast<CachedScript*>(cachedResource)->script();
     180            *result = toCachedScript(cachedResource)->script();
    181181            return true;
    182182        case CachedResource::RawResource: {
  • trunk/Source/WebCore/inspector/InspectorResourceAgent.cpp

    r163089 r163242  
    335335    m_resourcesData->addCachedResource(requestId, resource);
    336336    if (resource->type() == CachedResource::RawResource) {
    337         CachedRawResource* rawResource = static_cast<CachedRawResource*>(resource);
     337        CachedRawResource* rawResource = toCachedRawResource(resource);
    338338        String rawRequestId = IdentifiersFactory::requestId(rawResource->identifier());
    339339        m_resourcesData->reuseXHRReplayData(requestId, rawRequestId);
  • trunk/Source/WebCore/loader/cache/CachedCSSStyleSheet.h

    r162158 r163242  
    6868    };
    6969
     70CACHED_RESOURCE_TYPE_CASTS(CachedCSSStyleSheet, CachedResource, CachedResource::CSSStyleSheet)
     71
    7072}
    7173
  • trunk/Source/WebCore/loader/cache/CachedFont.h

    r162897 r163242  
    7979};
    8080
     81CACHED_RESOURCE_TYPE_CASTS(CachedFont, CachedResource, CachedResource::FontResource)
     82
    8183} // namespace WebCore
    8284
  • trunk/Source/WebCore/loader/cache/CachedImage.h

    r163148 r163242  
    150150// into CachedImage or find a better place for this class.
    151151// FIXME: Remove the USE(CF) once we make MemoryCache::addImageToCache() platform-independent.
    152 class CachedImageManual : public CachedImage {
     152class CachedImageManual final : public CachedImage {
    153153public:
    154154    CachedImageManual(const URL&, Image*);
  • trunk/Source/WebCore/loader/cache/CachedRawResource.cpp

    r163089 r163242  
    4040    , m_identifier(0)
    4141{
     42    // FIXME: The wrong CachedResource::Type here may cause a bad cast elsewhere.
     43    ASSERT(isMainOrRawResource());
    4244}
    4345
     
    182184    // If we're in the middle of a successful revalidation, responseReceived() hasn't been called, so we haven't set m_identifier.
    183185    ASSERT(!m_identifier);
    184     static_cast<CachedRawResource*>(resourceToRevalidate())->m_identifier = m_loader->identifier();
     186    toCachedRawResource(resourceToRevalidate())->m_identifier = m_loader->identifier();
    185187    CachedResource::switchClientsToRevalidatedResource();
    186188}
  • trunk/Source/WebCore/loader/cache/CachedRawResource.h

    r162158 r163242  
    8989};
    9090
     91TYPE_CASTS_BASE(CachedRawResource, CachedResource, resource, resource->isMainOrRawResource(), resource.isMainOrRawResource())
     92
    9193}
    9294
  • trunk/Source/WebCore/loader/cache/CachedResource.h

    r163148 r163242  
    157157
    158158    bool isImage() const { return type() == ImageResource; }
     159    // FIXME: CachedRawResource could be either a main resource or a raw XHR resource.
     160    bool isMainOrRawResource() const { return type() == MainResource || type() == RawResource; }
    159161    bool ignoreForRequestCount() const
    160162    {
  • trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp

    r163148 r163242  
    166166CachedResourceHandle<CachedFont> CachedResourceLoader::requestFont(CachedResourceRequest& request)
    167167{
    168     return static_cast<CachedFont*>(requestResource(CachedResource::FontResource, request).get());
     168    return toCachedFont(requestResource(CachedResource::FontResource, request).get());
    169169}
    170170
     
    172172CachedResourceHandle<CachedTextTrack> CachedResourceLoader::requestTextTrack(CachedResourceRequest& request)
    173173{
    174     return static_cast<CachedTextTrack*>(requestResource(CachedResource::TextTrackResource, request).get());
     174    return toCachedTextTrack(requestResource(CachedResource::TextTrackResource, request).get());
    175175}
    176176#endif
     
    178178CachedResourceHandle<CachedCSSStyleSheet> CachedResourceLoader::requestCSSStyleSheet(CachedResourceRequest& request)
    179179{
    180     return static_cast<CachedCSSStyleSheet*>(requestResource(CachedResource::CSSStyleSheet, request).get());
     180    return toCachedCSSStyleSheet(requestResource(CachedResource::CSSStyleSheet, request).get());
    181181}
    182182
     
    191191    if (CachedResource* existing = memoryCache()->resourceForRequest(request.resourceRequest())) {
    192192        if (existing->type() == CachedResource::CSSStyleSheet)
    193             return static_cast<CachedCSSStyleSheet*>(existing);
     193            return toCachedCSSStyleSheet(existing);
    194194        memoryCache()->remove(existing);
    195195    }
     
    209209CachedResourceHandle<CachedScript> CachedResourceLoader::requestScript(CachedResourceRequest& request)
    210210{
    211     return static_cast<CachedScript*>(requestResource(CachedResource::Script, request).get());
     211    return toCachedScript(requestResource(CachedResource::Script, request).get());
    212212}
    213213
     
    215215CachedResourceHandle<CachedXSLStyleSheet> CachedResourceLoader::requestXSLStyleSheet(CachedResourceRequest& request)
    216216{
    217     return static_cast<CachedXSLStyleSheet*>(requestResource(CachedResource::XSLStyleSheet, request).get());
     217    return toCachedXSLStyleSheet(requestResource(CachedResource::XSLStyleSheet, request).get());
    218218}
    219219#endif
     
    222222CachedResourceHandle<CachedSVGDocument> CachedResourceLoader::requestSVGDocument(CachedResourceRequest& request)
    223223{
    224     return static_cast<CachedSVGDocument*>(requestResource(CachedResource::SVGDocumentResource, request).get());
     224    return toCachedSVGDocument(requestResource(CachedResource::SVGDocumentResource, request).get());
    225225}
    226226#endif
     
    237237CachedResourceHandle<CachedRawResource> CachedResourceLoader::requestRawResource(CachedResourceRequest& request)
    238238{
    239     return static_cast<CachedRawResource*>(requestResource(CachedResource::RawResource, request).get());
     239    return toCachedRawResource(requestResource(CachedResource::RawResource, request).get());
    240240}
    241241
    242242CachedResourceHandle<CachedRawResource> CachedResourceLoader::requestMainResource(CachedResourceRequest& request)
    243243{
    244     return static_cast<CachedRawResource*>(requestResource(CachedResource::MainResource, request).get());
     244    return toCachedRawResource(requestResource(CachedResource::MainResource, request).get());
    245245}
    246246
  • trunk/Source/WebCore/loader/cache/CachedSVGDocument.h

    r162158 r163242  
    5050};
    5151
     52CACHED_RESOURCE_TYPE_CASTS(CachedSVGDocument, CachedResource, CachedResource::SVGDocumentResource)
     53
    5254} // namespace WebCore
    5355
  • trunk/Source/WebCore/loader/cache/CachedScript.h

    r162158 r163242  
    6262        RefPtr<TextResourceDecoder> m_decoder;
    6363    };
     64
     65CACHED_RESOURCE_TYPE_CASTS(CachedScript, CachedResource, CachedResource::Script)
     66
    6467}
    6568
  • trunk/Source/WebCore/loader/cache/CachedTextTrack.h

    r162158 r163242  
    4545};
    4646
     47CACHED_RESOURCE_TYPE_CASTS(CachedTextTrack, CachedResource, CachedResource::TextTrackResource)
     48
    4749}
    4850
  • trunk/Source/WebCore/loader/cache/CachedXSLStyleSheet.h

    r162158 r163242  
    5858    };
    5959
     60CACHED_RESOURCE_TYPE_CASTS(CachedXSLStyleSheet, CachedResource, CachedResource::XSLStyleSheet)
     61
    6062#endif
    6163
Note: See TracChangeset for help on using the changeset viewer.