From: ddkilzer@apple.com Date: Thu, 23 Oct 2008 02:53:02 +0000 (+0000) Subject: Bug 21781: WebCore::Settings should have a maximum decoded image size setting X-Git-Url: http://git.webkit.org/?p=WebKit-https.git;a=commitdiff_plain;h=8e9dd7034fa788ab96dd88036f4129b44d23eaad;hp=0bfdd23eea6d5bfd9724e951af435a2cfcf0b758 Bug 21781: WebCore::Settings should have a maximum decoded image size setting Reviewed by Antti. No tests since there is no change in behavior. * loader/CachedImage.cpp: (WebCore::CachedImage::maximumDecodedImageSize): Added. Returns WebCore::Settings::maximumDecodedImageSize() or 0 on error. (WebCore::CachedImage::data): Flag an error if the image being loaded is too big. * loader/CachedImage.h: (WebCore::CachedImage::maximumDecodedImageSize): Added declaration. * page/Settings.cpp: (WebCore::Settings::Settings): Initialize m_maximumDecodedImageSize to the maximum value of size_t. * page/Settings.h: (WebCore::Settings::setMaximumDecodedImageSize): Added method. (WebCore::Settings::maximumDecodedImageSize): Ditto. git-svn-id: https://svn.webkit.org/repository/webkit/trunk@37803 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog index a8abb2e..5253da5 100644 --- a/WebCore/ChangeLog +++ b/WebCore/ChangeLog @@ -1,3 +1,27 @@ +2008-10-22 David Kilzer + + Bug 21781: WebCore::Settings should have a maximum decoded image size setting + + + + Reviewed by Antti. + + No tests since there is no change in behavior. + + * loader/CachedImage.cpp: + (WebCore::CachedImage::maximumDecodedImageSize): Added. Returns + WebCore::Settings::maximumDecodedImageSize() or 0 on error. + (WebCore::CachedImage::data): Flag an error if the image being + loaded is too big. + * loader/CachedImage.h: + (WebCore::CachedImage::maximumDecodedImageSize): Added declaration. + * page/Settings.cpp: + (WebCore::Settings::Settings): Initialize m_maximumDecodedImageSize + to the maximum value of size_t. + * page/Settings.h: + (WebCore::Settings::setMaximumDecodedImageSize): Added method. + (WebCore::Settings::maximumDecodedImageSize): Ditto. + 2008-10-22 Mike Pinkerton Reviewed by Dan Bernstein. diff --git a/WebCore/loader/CachedImage.cpp b/WebCore/loader/CachedImage.cpp index 4dde549..f636184 100644 --- a/WebCore/loader/CachedImage.cpp +++ b/WebCore/loader/CachedImage.cpp @@ -29,8 +29,10 @@ #include "CachedResourceClient.h" #include "CachedResourceClientWalker.h" #include "DocLoader.h" +#include "Frame.h" #include "FrameView.h" #include "Request.h" +#include "Settings.h" #include "SystemTime.h" #include @@ -238,6 +240,15 @@ inline void CachedImage::createImage() m_image = BitmapImage::create(this); } +size_t CachedImage::maximumDecodedImageSize() +{ + Frame* frame = m_request ? m_request->docLoader()->frame() : 0; + if (!frame) + return 0; + Settings* settings = frame->settings(); + return settings ? settings->maximumDecodedImageSize() : 0; +} + void CachedImage::data(PassRefPtr data, bool allDataReceived) { m_data = data; @@ -256,8 +267,10 @@ void CachedImage::data(PassRefPtr data, bool allDataReceived) // network causes observers to repaint, which will force that chunk // to decode. if (sizeAvailable || allDataReceived) { - if (m_image->isNull()) { - // FIXME: I'm not convinced this case can even be hit. + size_t maxDecodedImageSize = maximumDecodedImageSize(); + IntSize s = imageSize(1.0f); + size_t estimatedDecodedImageSize = s.width() * s.height() * 4; // no overflow check + if (m_image->isNull() || (maxDecodedImageSize > 0 && estimatedDecodedImageSize > maxDecodedImageSize)) { error(); if (inCache()) cache()->remove(this); diff --git a/WebCore/loader/CachedImage.h b/WebCore/loader/CachedImage.h index 71a1ee7..f24e2fb 100644 --- a/WebCore/loader/CachedImage.h +++ b/WebCore/loader/CachedImage.h @@ -88,6 +88,7 @@ public: private: void createImage(); + size_t maximumDecodedImageSize(); void notifyObservers(); void decodedDataDeletionTimerFired(Timer*); diff --git a/WebCore/loader/CachedResource.h b/WebCore/loader/CachedResource.h index 5e469dd..c56a889 100644 --- a/WebCore/loader/CachedResource.h +++ b/WebCore/loader/CachedResource.h @@ -168,7 +168,7 @@ protected: void setEncodedSize(unsigned); void setDecodedSize(unsigned); void didAccessDecodedData(double timeStamp); - + HashCountedSet m_clients; String m_url; diff --git a/WebCore/page/Settings.cpp b/WebCore/page/Settings.cpp index c630042..603d064 100644 --- a/WebCore/page/Settings.cpp +++ b/WebCore/page/Settings.cpp @@ -32,6 +32,7 @@ #include "JavaScriptDebugServer.h" #include "Page.h" #include "PageCache.h" +#include #if ENABLE(DATABASE) #include "DatabaseTracker.h" @@ -86,6 +87,7 @@ Settings::Settings(Page* page) , m_shouldPaintCustomScrollbars(false) , m_zoomsTextOnly(false) , m_enforceCSSMIMETypeInStrictMode(true) + , m_maximumDecodedImageSize(std::numeric_limits::max()) { // A Frame may not have been created yet, so we initialize the AtomicString // hash before trying to use it. diff --git a/WebCore/page/Settings.h b/WebCore/page/Settings.h index 854faff..3eb0c4d 100644 --- a/WebCore/page/Settings.h +++ b/WebCore/page/Settings.h @@ -174,7 +174,10 @@ namespace WebCore { void setEnforceCSSMIMETypeInStrictMode(bool); bool enforceCSSMIMETypeInStrictMode() { return m_enforceCSSMIMETypeInStrictMode; } - + + void setMaximumDecodedImageSize(size_t size) { m_maximumDecodedImageSize = size; } + size_t maximumDecodedImageSize() const { return m_maximumDecodedImageSize; } + #if USE(SAFARI_THEME) // Windows debugging pref (global) for switching between the Aqua look and a native windows look. static void setShouldPaintNativeControls(bool); @@ -229,6 +232,7 @@ namespace WebCore { bool m_shouldPaintCustomScrollbars : 1; bool m_zoomsTextOnly : 1; bool m_enforceCSSMIMETypeInStrictMode : 1; + size_t m_maximumDecodedImageSize; #if USE(SAFARI_THEME) static bool gShouldPaintNativeControls;