diff options
-rw-r--r-- | cc/playback/display_list_recording_source.cc | 9 | ||||
-rw-r--r-- | media/base/video_frame.cc | 13 | ||||
-rw-r--r-- | ui/gfx/geometry/size.cc | 6 | ||||
-rw-r--r-- | ui/gfx/geometry/size.h | 3 |
4 files changed, 18 insertions, 13 deletions
diff --git a/cc/playback/display_list_recording_source.cc b/cc/playback/display_list_recording_source.cc index a199866..3a30cf9 100644 --- a/cc/playback/display_list_recording_source.cc +++ b/cc/playback/display_list_recording_source.cc @@ -148,13 +148,8 @@ bool DisplayListRecordingSource::UpdateAndExpandInvalidation( // Count the area that is being invalidated. Region recorded_invalidation(*invalidation); recorded_invalidation.Intersect(recorded_viewport_); - for (Region::Iterator it(recorded_invalidation); it.has_rect(); it.next()) { - // gfx::Size::GetArea might overflow in this case, so use an explicit - // CheckedNumeric instead. - base::CheckedNumeric<int> checked_area = it.rect().size().width(); - checked_area *= it.rect().size().height(); - timer.AddArea(checked_area); - } + for (Region::Iterator it(recorded_invalidation); it.has_rect(); it.next()) + timer.AddArea(it.rect().size().GetCheckedArea()); if (!updated && !invalidation->Intersects(recorded_viewport_)) return false; diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc index b2557cc..f73d5ac 100644 --- a/media/base/video_frame.cc +++ b/media/base/video_frame.cc @@ -5,6 +5,7 @@ #include "media/base/video_frame.h" #include <algorithm> +#include <climits> #include "base/bind.h" #include "base/callback_helpers.h" @@ -163,13 +164,15 @@ bool VideoFrame::IsValidConfig(VideoPixelFormat format, const gfx::Rect& visible_rect, const gfx::Size& natural_size) { // Check maximum limits for all formats. - if (coded_size.GetArea() > limits::kMaxCanvas || + int coded_size_area = coded_size.GetCheckedArea().ValueOrDefault(INT_MAX); + int natural_size_area = natural_size.GetCheckedArea().ValueOrDefault(INT_MAX); + static_assert(limits::kMaxCanvas < INT_MAX, ""); + if (coded_size_area > limits::kMaxCanvas || coded_size.width() > limits::kMaxDimension || - coded_size.height() > limits::kMaxDimension || - visible_rect.x() < 0 || visible_rect.y() < 0 || - visible_rect.right() > coded_size.width() || + coded_size.height() > limits::kMaxDimension || visible_rect.x() < 0 || + visible_rect.y() < 0 || visible_rect.right() > coded_size.width() || visible_rect.bottom() > coded_size.height() || - natural_size.GetArea() > limits::kMaxCanvas || + natural_size_area > limits::kMaxCanvas || natural_size.width() > limits::kMaxDimension || natural_size.height() > limits::kMaxDimension) return false; diff --git a/ui/gfx/geometry/size.cc b/ui/gfx/geometry/size.cc index e58bb22..7b5b522 100644 --- a/ui/gfx/geometry/size.cc +++ b/ui/gfx/geometry/size.cc @@ -45,9 +45,13 @@ CGSize Size::ToCGSize() const { #endif int Size::GetArea() const { + return GetCheckedArea().ValueOrDie(); +} + +base::CheckedNumeric<int> Size::GetCheckedArea() const { base::CheckedNumeric<int> checked_area = width(); checked_area *= height(); - return checked_area.ValueOrDie(); + return checked_area; } void Size::Enlarge(int grow_width, int grow_height) { diff --git a/ui/gfx/geometry/size.h b/ui/gfx/geometry/size.h index 27face1..de1df59 100644 --- a/ui/gfx/geometry/size.h +++ b/ui/gfx/geometry/size.h @@ -9,6 +9,7 @@ #include <string> #include "base/compiler_specific.h" +#include "base/numerics/safe_math.h" #include "ui/gfx/gfx_export.h" #if defined(OS_WIN) @@ -49,6 +50,8 @@ class GFX_EXPORT Size { // This call will CHECK if the area of this size would overflow int. int GetArea() const; + // Returns a checked numeric representation of the area. + base::CheckedNumeric<int> GetCheckedArea() const; void SetSize(int width, int height) { set_width(width); |