summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cc/playback/display_list_recording_source.cc9
-rw-r--r--media/base/video_frame.cc13
-rw-r--r--ui/gfx/geometry/size.cc6
-rw-r--r--ui/gfx/geometry/size.h3
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);