summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael BrĂ¼ning <michael.bruning@qt.io>2019-03-25 17:53:12 +0100
committerMichael BrĂ¼ning <michael.bruning@qt.io>2019-03-27 17:15:41 +0000
commit269d53ceabd846258ed38362a1c3108e2320e8af (patch)
tree47d41ffc287298556af2b93184f39a742e3a7985
parent03be3aa656a97db6b47ca1dddcbf1ccdde8f3c04 (diff)
downloadqtwebengine-chromium-269d53ceabd846258ed38362a1c3108e2320e8af.tar.gz
[Backport] Security bug 905509 (13/13)
Manual backport of original patch by Zhenyao Mo <zmo@chromium.org>: Remove Safe* math helper functions in gpu command buffer The base::Check* function semantics are better. BUG=905509 TEST=gpu_unittests R=piman@chromium.org Change-Id: Ide79451ade00bb6c76cff72ebbacf112b3497b72 Reviewed-on: https://chromium-review.googlesource.com/c/1408031 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r--chromium/gpu/command_buffer/build_cmd_buffer_lib.py4
-rw-r--r--chromium/gpu/command_buffer/client/gles2_implementation.cc31
-rw-r--r--chromium/gpu/command_buffer/common/gles2_cmd_utils.cc46
-rw-r--r--chromium/gpu/command_buffer/common/gles2_cmd_utils.h31
-rw-r--r--chromium/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc52
-rw-r--r--chromium/gpu/command_buffer/service/buffer_manager.cc26
-rw-r--r--chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc50
-rw-r--r--chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h32
-rw-r--r--chromium/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc2
-rw-r--r--chromium/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc32
-rw-r--r--chromium/gpu/command_buffer/service/raster_decoder.cc4
-rw-r--r--chromium/gpu/command_buffer/service/raster_decoder_autogen.h6
-rw-r--r--chromium/gpu/command_buffer/service/renderbuffer_manager.cc19
-rw-r--r--chromium/gpu/command_buffer/service/texture_manager.cc18
14 files changed, 129 insertions, 224 deletions
diff --git a/chromium/gpu/command_buffer/build_cmd_buffer_lib.py b/chromium/gpu/command_buffer/build_cmd_buffer_lib.py
index 72602b2d01e..6284959ae75 100644
--- a/chromium/gpu/command_buffer/build_cmd_buffer_lib.py
+++ b/chromium/gpu/command_buffer/build_cmd_buffer_lib.py
@@ -2186,7 +2186,7 @@ class GENnHandler(TypeHandler):
def WriteGetDataSizeCode(self, func, f):
"""Overrriden from TypeHandler."""
code = """ uint32_t data_size;
- if (!%sSafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&%(data_size)s)) {
return error::kOutOfBounds;
}
""" % _Namespace()
@@ -2638,7 +2638,7 @@ class DELnHandler(TypeHandler):
def WriteGetDataSizeCode(self, func, f):
"""Overrriden from TypeHandler."""
code = """ uint32_t data_size;
- if (!%sSafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&%(data_size)s)) {
return error::kOutOfBounds;
}
""" % _Namespace()
diff --git a/chromium/gpu/command_buffer/client/gles2_implementation.cc b/chromium/gpu/command_buffer/client/gles2_implementation.cc
index 511e087d5da..f43d3760533 100644
--- a/chromium/gpu/command_buffer/client/gles2_implementation.cc
+++ b/chromium/gpu/command_buffer/client/gles2_implementation.cc
@@ -2069,7 +2069,8 @@ void GLES2Implementation::BufferSubDataHelper(
int32_t end = 0;
int32_t buffer_size = buffer->size();
- if (!SafeAddInt32(offset, size, &end) || end > buffer_size) {
+ if (!base::CheckAdd(offset, size).AssignIfValid(&end) ||
+ end > buffer_size) {
SetGLError(GL_INVALID_VALUE, "glBufferSubData", "out of range");
return;
}
@@ -4559,7 +4560,10 @@ void GLES2Implementation::DrawArrays(GLenum mode, GLint first, GLsizei count) {
bool simulated = false;
if (vertex_array_object_manager_->SupportsClientSideBuffers()) {
GLsizei num_elements;
- SafeAddInt32(first, count, &num_elements);
+ if (!base::CheckAdd(first, count).AssignIfValid(&num_elements)) {
+ SetGLError(GL_INVALID_VALUE, "glDrawArrays", "first+count overflow");
+ return;
+ }
if (!vertex_array_object_manager_->SetupSimulatedClientSideBuffers(
"glDrawArrays", this, helper_, num_elements, 0, &simulated)) {
return;
@@ -5805,7 +5809,11 @@ void GLES2Implementation::DrawArraysInstancedANGLE(
bool simulated = false;
if (vertex_array_object_manager_->SupportsClientSideBuffers()) {
GLsizei num_elements;
- SafeAddInt32(first, count, &num_elements);
+ if (!base::CheckAdd(first, count).AssignIfValid(&num_elements)) {
+ SetGLError(GL_INVALID_VALUE, "glDrawArraysInstancedANGLE",
+ "first+count overflow");
+ return;
+ }
if (!vertex_array_object_manager_->SetupSimulatedClientSideBuffers(
"glDrawArraysInstancedANGLE", this, helper_, num_elements,
primcount, &simulated)) {
@@ -6550,7 +6558,8 @@ void GLES2Implementation::DeletePathsCHROMIUM(GLuint first_client_id,
return;
GLuint last_client_id;
- if (!SafeAddUint32(first_client_id, range - 1, &last_client_id)) {
+ if (!base::CheckAdd(first_client_id, range - 1)
+ .AssignIfValid(&last_client_id)) {
SetGLError(GL_INVALID_OPERATION, kFunctionName, "overflow");
return;
}
@@ -6615,13 +6624,15 @@ void GLES2Implementation::PathCommandsCHROMIUM(GLuint path,
}
uint32_t coords_size;
- if (!SafeMultiplyUint32(num_coords, coord_type_size, &coords_size)) {
+ if (!base::CheckMul(num_coords, coord_type_size)
+ .AssignIfValid(&coords_size)) {
SetGLError(GL_INVALID_OPERATION, kFunctionName, "overflow");
return;
}
uint32_t required_buffer_size;
- if (!SafeAddUint32(coords_size, num_commands, &required_buffer_size)) {
+ if (!base::CheckAdd(coords_size, num_commands)
+ .AssignIfValid(&required_buffer_size)) {
SetGLError(GL_INVALID_OPERATION, kFunctionName, "overflow");
return;
}
@@ -6711,7 +6722,7 @@ bool GLES2Implementation::PrepareInstancedPathCommand(
}
uint32_t paths_size;
- if (!SafeMultiplyUint32(path_name_size, num_paths, &paths_size)) {
+ if (!base::CheckMul(path_name_size, num_paths).AssignIfValid(&paths_size)) {
SetGLError(GL_INVALID_OPERATION, function_name, "overflow");
return false;
}
@@ -6721,13 +6732,15 @@ bool GLES2Implementation::PrepareInstancedPathCommand(
uint32_t one_transform_size = sizeof(GLfloat) * transforms_component_count;
uint32_t transforms_size;
- if (!SafeMultiplyUint32(one_transform_size, num_paths, &transforms_size)) {
+ if (!base::CheckMul(one_transform_size, num_paths)
+ .AssignIfValid(&transforms_size)) {
SetGLError(GL_INVALID_OPERATION, function_name, "overflow");
return false;
}
uint32_t required_buffer_size;
- if (!SafeAddUint32(transforms_size, paths_size, &required_buffer_size)) {
+ if (!base::CheckAdd(transforms_size, paths_size)
+ .AssignIfValid(&required_buffer_size)) {
SetGLError(GL_INVALID_OPERATION, function_name, "overflow");
return false;
}
diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_utils.cc b/chromium/gpu/command_buffer/common/gles2_cmd_utils.cc
index 1f623eaf070..c7a98f9e873 100644
--- a/chromium/gpu/command_buffer/common/gles2_cmd_utils.cc
+++ b/chromium/gpu/command_buffer/common/gles2_cmd_utils.cc
@@ -586,7 +586,8 @@ bool GLES2Util::ComputeImageRowSizeHelper(int width,
DCHECK(alignment == 1 || alignment == 2 ||
alignment == 4 || alignment == 8);
uint32_t unpadded_row_size;
- if (!SafeMultiplyUint32(width, bytes_per_group, &unpadded_row_size)) {
+ if (!base::CheckMul(width, bytes_per_group)
+ .AssignIfValid(&unpadded_row_size)) {
return false;
}
uint32_t residual = unpadded_row_size % alignment;
@@ -594,7 +595,8 @@ bool GLES2Util::ComputeImageRowSizeHelper(int width,
uint32_t padded_row_size = unpadded_row_size;
if (residual > 0) {
padding = alignment - residual;
- if (!SafeAddUint32(unpadded_row_size, padding, &padded_row_size)) {
+ if (!base::CheckAdd(unpadded_row_size, padding)
+ .AssignIfValid(&padded_row_size)) {
return false;
}
}
@@ -664,8 +666,8 @@ bool GLES2Util::ComputeImageDataSizesES3(
int image_height = params.image_height > 0 ? params.image_height : height;
uint32_t num_of_rows;
if (depth > 0) {
- if (!SafeMultiplyUint32(image_height, depth - 1, &num_of_rows) ||
- !SafeAddUint32(num_of_rows, height, &num_of_rows)) {
+ if (!base::CheckAdd(base::CheckMul(image_height, depth - 1), height)
+ .AssignIfValid(&num_of_rows)) {
return false;
}
} else {
@@ -673,42 +675,28 @@ bool GLES2Util::ComputeImageDataSizesES3(
}
if (num_of_rows > 0) {
- uint32_t size_of_all_but_last_row;
- if (!SafeMultiplyUint32((num_of_rows - 1), padded_row_size,
- &size_of_all_but_last_row)) {
- return false;
- }
- if (!SafeAddUint32(size_of_all_but_last_row, unpadded_row_size, size)) {
+ if (!base::CheckAdd(base::CheckMul(num_of_rows - 1, padded_row_size),
+ unpadded_row_size)
+ .AssignIfValid(size)) {
return false;
}
} else {
*size = 0;
}
- uint32_t skip_size = 0;
+ base::CheckedNumeric<uint32_t> skip_size = 0;
if (params.skip_images > 0) {
- uint32_t image_size;
- if (!SafeMultiplyUint32(image_height, padded_row_size, &image_size))
- return false;
- if (!SafeMultiplyUint32(image_size, params.skip_images, &skip_size))
- return false;
+ skip_size = image_height;
+ skip_size *= padded_row_size;
+ skip_size *= params.skip_images;
}
if (params.skip_rows > 0) {
- uint32_t temp;
- if (!SafeMultiplyUint32(padded_row_size, params.skip_rows, &temp))
- return false;
- if (!SafeAddUint32(skip_size, temp, &skip_size))
- return false;
+ skip_size += base::CheckMul(padded_row_size, params.skip_rows);
}
if (params.skip_pixels > 0) {
- uint32_t temp;
- if (!SafeMultiplyUint32(bytes_per_group, params.skip_pixels, &temp))
- return false;
- if (!SafeAddUint32(skip_size, temp, &skip_size))
- return false;
+ skip_size += base::CheckMul(bytes_per_group, params.skip_pixels);
}
- uint32_t total_size;
- if (!SafeAddUint32(*size, skip_size, &total_size))
+ if (!base::CheckAdd(*size, skip_size).IsValid())
return false;
if (opt_padded_row_size) {
@@ -718,7 +706,7 @@ bool GLES2Util::ComputeImageDataSizesES3(
*opt_unpadded_row_size = unpadded_row_size;
}
if (opt_skip_size)
- *opt_skip_size = skip_size;
+ *opt_skip_size = skip_size.ValueOrDefault(0);
return true;
}
diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_utils.h b/chromium/gpu/command_buffer/common/gles2_cmd_utils.h
index 685223f022c..46a48746c5b 100644
--- a/chromium/gpu/command_buffer/common/gles2_cmd_utils.h
+++ b/chromium/gpu/command_buffer/common/gles2_cmd_utils.h
@@ -22,37 +22,6 @@
namespace gpu {
namespace gles2 {
-// Does a multiply and checks for overflow. If the multiply did not overflow
-// returns true.
-
-// Multiplies 2 32 bit unsigned numbers checking for overflow.
-// If there was no overflow returns true.
-inline bool SafeMultiplyUint32(uint32_t a, uint32_t b, uint32_t* dst) {
- DCHECK(dst);
- base::CheckedNumeric<uint32_t> checked = a;
- checked *= b;
- *dst = checked.ValueOrDefault(0);
- return checked.IsValid();
-}
-
-// Does an add checking for overflow. If there was no overflow returns true.
-inline bool SafeAddUint32(uint32_t a, uint32_t b, uint32_t* dst) {
- DCHECK(dst);
- base::CheckedNumeric<uint32_t> checked = a;
- checked += b;
- *dst = checked.ValueOrDefault(0);
- return checked.IsValid();
-}
-
-// Does an add checking for overflow. If there was no overflow returns true.
-inline bool SafeAddInt32(int32_t a, int32_t b, int32_t* dst) {
- DCHECK(dst);
- base::CheckedNumeric<int32_t> checked = a;
- checked += b;
- *dst = checked.ValueOrDefault(0);
- return checked.IsValid();
-}
-
// Returns the address of the first byte after a struct.
template <typename T>
const volatile void* AddressAfterStruct(const volatile T& pod) {
diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc b/chromium/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc
index 459e39e408f..993d6e6a758 100644
--- a/chromium/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc
+++ b/chromium/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc
@@ -21,58 +21,6 @@ class GLES2UtilTest : public testing:: Test {
GLES2Util util_;
};
-TEST_F(GLES2UtilTest, SafeMultiplyUint32) {
- uint32_t result = 0;
- EXPECT_TRUE(SafeMultiplyUint32(2u, 3u, &result));
- EXPECT_EQ(6u, result);
- EXPECT_FALSE(SafeMultiplyUint32(0x80000000u, 2u, &result));
- EXPECT_EQ(0u, result);
- EXPECT_TRUE(SafeMultiplyUint32(0x2u, 0x7FFFFFFFu, &result));
- EXPECT_EQ(0xFFFFFFFEu, result);
- EXPECT_FALSE(SafeMultiplyUint32(2u, 0x80000000u, &result));
- EXPECT_EQ(0u, result);
-}
-
-TEST_F(GLES2UtilTest, SafeAddUint32) {
- uint32_t result = 0;
- EXPECT_TRUE(SafeAddUint32(2u, 3u, &result));
- EXPECT_EQ(5u, result);
- EXPECT_FALSE(SafeAddUint32(0x80000000u, 0x80000000u, &result));
- EXPECT_EQ(0u, result);
- EXPECT_TRUE(SafeAddUint32(0xFFFFFFFEu, 0x1u, &result));
- EXPECT_EQ(0xFFFFFFFFu, result);
- EXPECT_FALSE(SafeAddUint32(0xFFFFFFFEu, 0x2u, &result));
- EXPECT_EQ(0u, result);
- EXPECT_TRUE(SafeAddUint32(0x1u, 0xFFFFFFFEu, &result));
- EXPECT_EQ(0xFFFFFFFFu, result);
- EXPECT_FALSE(SafeAddUint32(0x2u, 0xFFFFFFFEu, &result));
- EXPECT_EQ(0u, result);
-}
-
-TEST_F(GLES2UtilTest, SafeAddInt32) {
- int32_t result = 0;
- const int32_t kMax = std::numeric_limits<int32_t>::max();
- const int32_t kMin = std::numeric_limits<int32_t>::min();
- EXPECT_TRUE(SafeAddInt32(2, 3, &result));
- EXPECT_EQ(5, result);
- EXPECT_FALSE(SafeAddInt32(kMax, 1, &result));
- EXPECT_EQ(0, result);
- EXPECT_TRUE(SafeAddInt32(kMin + 1, -1, &result));
- EXPECT_EQ(kMin, result);
- EXPECT_FALSE(SafeAddInt32(kMin, -1, &result));
- EXPECT_EQ(0, result);
- EXPECT_TRUE(SafeAddInt32(kMax - 1, 1, &result));
- EXPECT_EQ(kMax, result);
- EXPECT_FALSE(SafeAddInt32(1, kMax, &result));
- EXPECT_EQ(0, result);
- EXPECT_TRUE(SafeAddInt32(-1, kMin + 1, &result));
- EXPECT_EQ(kMin, result);
- EXPECT_FALSE(SafeAddInt32(-1, kMin, &result));
- EXPECT_EQ(0, result);
- EXPECT_TRUE(SafeAddInt32(1, kMax - 1, &result));
- EXPECT_EQ(kMax, result);
-}
-
TEST_F(GLES2UtilTest, GLGetNumValuesReturned) {
EXPECT_EQ(0, util_.GLGetNumValuesReturned(GL_COMPRESSED_TEXTURE_FORMATS));
EXPECT_EQ(0, util_.GLGetNumValuesReturned(GL_SHADER_BINARY_FORMATS));
diff --git a/chromium/gpu/command_buffer/service/buffer_manager.cc b/chromium/gpu/command_buffer/service/buffer_manager.cc
index 4276bf81266..5bb00ef69a1 100644
--- a/chromium/gpu/command_buffer/service/buffer_manager.cc
+++ b/chromium/gpu/command_buffer/service/buffer_manager.cc
@@ -10,12 +10,11 @@
#include "base/format_macros.h"
#include "base/logging.h"
-#include "base/numerics/safe_math.h"
+#include "base/numerics/checked_math.h"
#include "base/strings/stringprintf.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/memory_dump_manager.h"
#include "base/trace_event/trace_event.h"
-#include "gpu/command_buffer/common/gles2_cmd_utils.h"
#include "gpu/command_buffer/service/context_state.h"
#include "gpu/command_buffer/service/error_state.h"
#include "gpu/command_buffer/service/feature_info.h"
@@ -210,9 +209,8 @@ bool Buffer::CheckRange(GLintptr offset, GLsizeiptr size) const {
size < 0 || size > std::numeric_limits<int32_t>::max()) {
return false;
}
- base::CheckedNumeric<int32_t> max = offset;
- max += size;
- return max.IsValid() && max.ValueOrDefault(0) <= size_;
+ int32_t max;
+ return base::CheckAdd(offset, size).AssignIfValid(&max) && max <= size_;
}
void Buffer::SetRange(GLintptr offset, GLsizeiptr size, const GLvoid * data) {
@@ -307,12 +305,10 @@ bool Buffer::GetMaxValueForRange(
}
uint32_t size;
- if (!SafeMultiplyUint32(
- count, GLES2Util::GetGLTypeSizeForBuffers(type), &size)) {
- return false;
- }
-
- if (!SafeAddUint32(offset, size, &size)) {
+ if (!base::CheckAdd(
+ offset,
+ base::CheckMul(count, GLES2Util::GetGLTypeSizeForBuffers(type)))
+ .AssignIfValid(&size)) {
return false;
}
@@ -897,10 +893,10 @@ bool BufferManager::RequestBuffersAccess(
return false;
}
GLsizeiptr size = bindings->GetEffectiveBufferSize(ii);
- base::CheckedNumeric<GLsizeiptr> required_size = variable_sizes[ii];
- required_size *= count;
- if (size < required_size.ValueOrDefault(
- std::numeric_limits<GLsizeiptr>::max())) {
+ GLsizeiptr required_size;
+ if (!base::CheckMul(variable_sizes[ii], count)
+ .AssignIfValid(&required_size) ||
+ size < required_size) {
std::string msg = base::StringPrintf(
"%s : buffer or buffer range at index %zu not large enough",
message_tag, ii);
diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc
index dbc3883da46..fa4cb3eb118 100644
--- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4355,7 +4355,8 @@ bool GLES2DecoderImpl::GenTransformFeedbacksHelper(
bool GLES2DecoderImpl::GenPathsCHROMIUMHelper(GLuint first_client_id,
GLsizei range) {
GLuint last_client_id;
- if (!SafeAddUint32(first_client_id, range - 1, &last_client_id))
+ if (range < 1 || !base::CheckAdd(first_client_id, range - 1)
+ .AssignIfValid(&last_client_id))
return false;
if (path_manager()->HasPathsInRange(first_client_id, last_client_id))
@@ -4381,7 +4382,8 @@ bool GLES2DecoderImpl::GenPathsCHROMIUMHelper(GLuint first_client_id,
bool GLES2DecoderImpl::DeletePathsCHROMIUMHelper(GLuint first_client_id,
GLsizei range) {
GLuint last_client_id;
- if (!SafeAddUint32(first_client_id, range - 1, &last_client_id))
+ if (range < 1 || !base::CheckAdd(first_client_id, range - 1)
+ .AssignIfValid(&last_client_id))
return false;
path_manager()->RemovePaths(first_client_id, last_client_id);
@@ -10358,7 +10360,8 @@ bool GLES2DecoderImpl::SimulateAttrib0(
uint32_t size_needed = 0;
if (num_vertices == 0 ||
- !SafeMultiplyUint32(num_vertices, sizeof(Vec4f), &size_needed) ||
+ !base::CheckMul(num_vertices, sizeof(Vec4f))
+ .AssignIfValid(&size_needed) ||
size_needed > 0x7FFFFFFFU) {
LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0");
return false;
@@ -10475,7 +10478,7 @@ bool GLES2DecoderImpl::SimulateFixedAttribs(
// to be used normally. It's just here to pass that OpenGL ES 2.0 conformance
// tests so we just add to the buffer attrib used.
- GLuint elements_needed = 0;
+ base::CheckedNumeric<uint32_t> elements_needed = 0;
const VertexAttribManager::VertexAttribList& enabled_attribs =
state_.vertex_attrib_manager->GetEnabledVertexAttribs();
for (VertexAttribManager::VertexAttribList::const_iterator it =
@@ -10494,19 +10497,14 @@ bool GLES2DecoderImpl::SimulateFixedAttribs(
if (attrib_info &&
attrib->CanAccess(max_accessed) &&
attrib->type() == GL_FIXED) {
- uint32_t elements_used = 0;
- if (!SafeMultiplyUint32(num_vertices, attrib->size(), &elements_used) ||
- !SafeAddUint32(elements_needed, elements_used, &elements_needed)) {
- LOCAL_SET_GL_ERROR(
- GL_OUT_OF_MEMORY, function_name, "simulating GL_FIXED attribs");
- return false;
- }
+ elements_needed += base::CheckMul(num_vertices, attrib->size());
}
}
const uint32_t kSizeOfFloat = sizeof(float); // NOLINT
uint32_t size_needed = 0;
- if (!SafeMultiplyUint32(elements_needed, kSizeOfFloat, &size_needed) ||
+ if (!base::CheckMul(elements_needed, kSizeOfFloat)
+ .AssignIfValid(&size_needed) ||
size_needed > 0x7FFFFFFFU) {
LOCAL_SET_GL_ERROR(
GL_OUT_OF_MEMORY, function_name, "simulating GL_FIXED attribs");
@@ -11972,7 +11970,8 @@ error::Error GLES2DecoderImpl::HandleReadPixels(uint32_t immediate_data_size,
return error::kNoError;
}
uint32_t size = 0;
- if (!SafeAddUint32(pixels_size + skip_size, pixels_shm_offset, &size)) {
+ if (!base::CheckAdd(pixels_size + skip_size, pixels_shm_offset)
+ .AssignIfValid(&size)) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, func_name, "size + offset overflow");
return error::kNoError;
}
@@ -12117,7 +12116,8 @@ error::Error GLES2DecoderImpl::HandleReadPixels(uint32_t immediate_data_size,
int32_t max_x;
int32_t max_y;
- if (!SafeAddInt32(x, width, &max_x) || !SafeAddInt32(y, height, &max_y)) {
+ if (!base::CheckAdd(x, width).AssignIfValid(&max_x) ||
+ !base::CheckAdd(y, height).AssignIfValid(&max_y)) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, func_name, "dimensions out of range");
return error::kNoError;
}
@@ -13329,7 +13329,8 @@ bool GLES2DecoderImpl::ClearLevel3D(Texture* texture,
subs.push_back(TexSubCoord3D(0, 0, 0, width, height, depth));
} else {
uint32_t size_per_layer;
- if (!SafeMultiplyUint32(padded_row_size, height, &size_per_layer)) {
+ if (!base::CheckMul(padded_row_size, height)
+ .AssignIfValid(&size_per_layer)) {
return false;
}
if (size_per_layer < kMaxZeroSize) {
@@ -14285,7 +14286,7 @@ error::Error GLES2DecoderImpl::HandleTexImage2D(uint32_t immediate_data_size,
// For testing only. Allows us to stress the ability to respond to OOM errors.
uint32_t num_pixels;
if (workarounds().simulate_out_of_memory_on_large_textures &&
- (!SafeMultiplyUint32(width, height, &num_pixels) ||
+ (!base::CheckMul(width, height).AssignIfValid(&num_pixels) ||
(num_pixels >= 4096 * 4096))) {
LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, func_name, "synthetic out of memory");
return error::kNoError;
@@ -14382,7 +14383,7 @@ error::Error GLES2DecoderImpl::HandleTexImage3D(uint32_t immediate_data_size,
// For testing only. Allows us to stress the ability to respond to OOM errors.
uint32_t num_pixels;
if (workarounds().simulate_out_of_memory_on_large_textures &&
- (!SafeMultiplyUint32(width, height, &num_pixels) ||
+ (!base::CheckMul(width, height).AssignIfValid(&num_pixels) ||
(num_pixels >= 4096 * 4096))) {
LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, func_name, "synthetic out of memory");
return error::kNoError;
@@ -15839,7 +15840,7 @@ error::Error GLES2DecoderImpl::HandleShaderBinary(
return error::kNoError;
}
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(%data_size)) {
return error::kOutOfBounds;
}
const GLuint* shaders = GetSharedMemoryAs<const GLuint*>(
@@ -17324,8 +17325,9 @@ void GLES2DecoderImpl::CopySubTextureHelper(const char* function_name,
// See: https://crbug.com/586476
int32_t max_x;
int32_t max_y;
- if (!SafeAddInt32(x, width, &max_x) || !SafeAddInt32(y, height, &max_y) ||
- x < 0 || y < 0 || max_x > source_width || max_y > source_height) {
+ if (!base::CheckAdd(x, width).AssignIfValid(&max_x) ||
+ !base::CheckAdd(y, height).AssignIfValid(&max_y) || x < 0 || y < 0 ||
+ max_x > source_width || max_y > source_height) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name,
"source texture bad dimensions");
return;
@@ -19010,7 +19012,8 @@ class PathCommandValidatorContext {
DCHECK_LE(transforms_component_count, 12U);
uint32_t one_transform_size = sizeof(GLfloat) * transforms_component_count;
uint32_t transforms_size = 0;
- if (!SafeMultiplyUint32(one_transform_size, num_paths, &transforms_size)) {
+ if (!base::CheckMul(one_transform_size, num_paths)
+ .AssignIfValid(&transforms_size)) {
error_ = error::kOutOfBounds;
return false;
}
@@ -19045,7 +19048,7 @@ class PathCommandValidatorContext {
uint32_t shm_offset,
std::unique_ptr<GLuint[]>* out_buffer) {
uint32_t paths_size = 0;
- if (!SafeMultiplyUint32(num_paths, sizeof(T), &paths_size)) {
+ if (!base::CheckMul(num_paths, sizeof(T)).AssignIfValid(&paths_size)) {
error_ = error::kOutOfBounds;
return false;
}
@@ -19225,7 +19228,8 @@ error::Error GLES2DecoderImpl::HandlePathCommandsCHROMIUM(
uint32_t coords_size = 0;
uint32_t coord_type_size =
GLES2Util::GetGLTypeSizeForPathCoordType(coord_type);
- if (!SafeMultiplyUint32(num_coords, coord_type_size, &coords_size))
+ if (!base::CheckMul(num_coords, coord_type_size)
+ .AssignIfValid(&coords_size))
return error::kOutOfBounds;
uint32_t coords_shm_id = static_cast<uint32_t>(c.coords_shm_id);
diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index b5c7c24da3f..47b0044016a 100644
--- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -739,7 +739,7 @@ error::Error GLES2DecoderImpl::HandleDeleteBuffersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size) {
return error::kOutOfBounds;
}
volatile const GLuint* buffers = GetImmediateDataAs<volatile const GLuint*>(
@@ -759,7 +759,7 @@ error::Error GLES2DecoderImpl::HandleDeleteFramebuffersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* framebuffers =
@@ -780,7 +780,7 @@ error::Error GLES2DecoderImpl::HandleDeleteRenderbuffersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* renderbuffers =
@@ -803,7 +803,7 @@ error::Error GLES2DecoderImpl::HandleDeleteSamplersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* samplers = GetImmediateDataAs<volatile const GLuint*>(
@@ -834,7 +834,7 @@ error::Error GLES2DecoderImpl::HandleDeleteTexturesImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* textures = GetImmediateDataAs<volatile const GLuint*>(
@@ -857,7 +857,7 @@ error::Error GLES2DecoderImpl::HandleDeleteTransformFeedbacksImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* ids = GetImmediateDataAs<volatile const GLuint*>(
@@ -1111,7 +1111,7 @@ error::Error GLES2DecoderImpl::HandleGenBuffersImmediate(
*static_cast<const volatile gles2::cmds::GenBuffersImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* buffers =
@@ -1151,7 +1151,7 @@ error::Error GLES2DecoderImpl::HandleGenFramebuffersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* framebuffers =
@@ -1177,7 +1177,7 @@ error::Error GLES2DecoderImpl::HandleGenRenderbuffersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* renderbuffers =
@@ -1204,7 +1204,7 @@ error::Error GLES2DecoderImpl::HandleGenSamplersImmediate(
*static_cast<const volatile gles2::cmds::GenSamplersImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* samplers =
@@ -1229,7 +1229,7 @@ error::Error GLES2DecoderImpl::HandleGenTexturesImmediate(
*static_cast<const volatile gles2::cmds::GenTexturesImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* textures =
@@ -1257,7 +1257,7 @@ error::Error GLES2DecoderImpl::HandleGenTransformFeedbacksImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* ids =
@@ -4317,7 +4317,7 @@ error::Error GLES2DecoderImpl::HandleGenQueriesEXTImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* queries =
@@ -4343,7 +4343,7 @@ error::Error GLES2DecoderImpl::HandleDeleteQueriesEXTImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* queries = GetImmediateDataAs<volatile const GLuint*>(
@@ -4435,7 +4435,7 @@ error::Error GLES2DecoderImpl::HandleGenVertexArraysOESImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* arrays =
@@ -4461,7 +4461,7 @@ error::Error GLES2DecoderImpl::HandleDeleteVertexArraysOESImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* arrays = GetImmediateDataAs<volatile const GLuint*>(
diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc
index b694ab930e9..ee526ebe27e 100644
--- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc
+++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc
@@ -945,7 +945,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleShaderBinary(
uint32_t binary_shm_offset = c.binary_shm_offset;
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
const GLuint* shaders = GetSharedMemoryAs<const GLuint*>(
diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
index 863be0bc6de..8c902e70e74 100644
--- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
+++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
@@ -573,7 +573,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleDeleteBuffersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* buffers = GetImmediateDataAs<volatile const GLuint*>(
@@ -596,7 +596,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleDeleteFramebuffersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* framebuffers =
@@ -633,7 +633,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleDeleteRenderbuffersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* renderbuffers =
@@ -659,7 +659,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleDeleteSamplersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* samplers = GetImmediateDataAs<volatile const GLuint*>(
@@ -710,7 +710,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleDeleteTexturesImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* textures = GetImmediateDataAs<volatile const GLuint*>(
@@ -737,7 +737,7 @@ GLES2DecoderPassthroughImpl::HandleDeleteTransformFeedbacksImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* ids = GetImmediateDataAs<volatile const GLuint*>(
@@ -957,7 +957,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleGenBuffersImmediate(
*static_cast<const volatile gles2::cmds::GenBuffersImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* buffers =
@@ -993,7 +993,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleGenFramebuffersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* framebuffers =
@@ -1016,7 +1016,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleGenRenderbuffersImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* renderbuffers =
@@ -1040,7 +1040,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleGenSamplersImmediate(
*static_cast<const volatile gles2::cmds::GenSamplersImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* samplers =
@@ -1062,7 +1062,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleGenTexturesImmediate(
*static_cast<const volatile gles2::cmds::GenTexturesImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* textures =
@@ -1087,7 +1087,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleGenTransformFeedbacksImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* ids =
@@ -3751,7 +3751,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleGenQueriesEXTImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* queries =
@@ -3774,7 +3774,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleDeleteQueriesEXTImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* queries = GetImmediateDataAs<volatile const GLuint*>(
@@ -3835,7 +3835,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleGenVertexArraysOESImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* arrays =
@@ -3858,7 +3858,7 @@ error::Error GLES2DecoderPassthroughImpl::HandleDeleteVertexArraysOESImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* arrays = GetImmediateDataAs<volatile const GLuint*>(
diff --git a/chromium/gpu/command_buffer/service/raster_decoder.cc b/chromium/gpu/command_buffer/service/raster_decoder.cc
index 24ad0fc683d..4080899df2b 100644
--- a/chromium/gpu/command_buffer/service/raster_decoder.cc
+++ b/chromium/gpu/command_buffer/service/raster_decoder.cc
@@ -2695,8 +2695,8 @@ void RasterDecoderImpl::DoCopySubTexture(GLuint source_id,
// See: https://crbug.com/586476
int32_t max_x;
int32_t max_y;
- if (!gles2::SafeAddInt32(x, width, &max_x) ||
- !gles2::SafeAddInt32(y, height, &max_y) || x < 0 || y < 0 ||
+ if (!base::CheckAdd(x, width).AssignIfValid(&max_x) ||
+ !base::CheckAdd(y, height).AssignIfValid(&max_y) || x < 0 || y < 0 ||
max_x > source_width || max_y > source_height) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTexture",
"source texture bad dimensions");
diff --git a/chromium/gpu/command_buffer/service/raster_decoder_autogen.h b/chromium/gpu/command_buffer/service/raster_decoder_autogen.h
index d239d6578db..af80c4cf792 100644
--- a/chromium/gpu/command_buffer/service/raster_decoder_autogen.h
+++ b/chromium/gpu/command_buffer/service/raster_decoder_autogen.h
@@ -20,7 +20,7 @@ error::Error RasterDecoderImpl::HandleDeleteTexturesImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!gles2::SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* textures =
@@ -102,7 +102,7 @@ error::Error RasterDecoderImpl::HandleGenQueriesEXTImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!gles2::SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* queries = gles2::GetImmediateDataAs<volatile GLuint*>(
@@ -128,7 +128,7 @@ error::Error RasterDecoderImpl::HandleDeleteQueriesEXTImmediate(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
- if (!gles2::SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* queries =
diff --git a/chromium/gpu/command_buffer/service/renderbuffer_manager.cc b/chromium/gpu/command_buffer/service/renderbuffer_manager.cc
index 722330a3ee2..edfc0694e0a 100644
--- a/chromium/gpu/command_buffer/service/renderbuffer_manager.cc
+++ b/chromium/gpu/command_buffer/service/renderbuffer_manager.cc
@@ -292,20 +292,13 @@ bool RenderbufferManager::ComputeEstimatedRenderbufferSize(
uint32_t* size) const {
DCHECK(size);
- uint32_t temp = 0;
- if (!SafeMultiplyUint32(width, height, &temp)) {
- return false;
- }
- if (!SafeMultiplyUint32(temp, (samples == 0 ? 1 : samples), &temp)) {
- return false;
- }
GLenum impl_format = InternalRenderbufferFormatToImplFormat(internal_format);
- if (!SafeMultiplyUint32(
- temp, GLES2Util::RenderbufferBytesPerPixel(impl_format), &temp)) {
- return false;
- }
- *size = temp;
- return true;
+ uint32_t bytes_per_pixel = GLES2Util::RenderbufferBytesPerPixel(impl_format);
+ base::CheckedNumeric<uint32_t> checked_size = width;
+ checked_size *= height;
+ checked_size *= (samples == 0 ? 1 : samples);
+ checked_size *= bytes_per_pixel;
+ return checked_size.AssignIfValid(size);
}
GLenum RenderbufferManager::InternalRenderbufferFormatToImplFormat(
diff --git a/chromium/gpu/command_buffer/service/texture_manager.cc b/chromium/gpu/command_buffer/service/texture_manager.cc
index d697bda2cbb..cd0576a974b 100644
--- a/chromium/gpu/command_buffer/service/texture_manager.cc
+++ b/chromium/gpu/command_buffer/service/texture_manager.cc
@@ -1256,18 +1256,12 @@ bool Texture::ValidForTexture(
int32_t max_x;
int32_t max_y;
int32_t max_z;
- return xoffset >= 0 &&
- yoffset >= 0 &&
- zoffset >= 0 &&
- width >= 0 &&
- height >= 0 &&
- depth >= 0 &&
- SafeAddInt32(xoffset, width, &max_x) &&
- SafeAddInt32(yoffset, height, &max_y) &&
- SafeAddInt32(zoffset, depth, &max_z) &&
- max_x <= info.width &&
- max_y <= info.height &&
- max_z <= info.depth;
+ return xoffset >= 0 && yoffset >= 0 && zoffset >= 0 && width >= 0 &&
+ height >= 0 && depth >= 0 &&
+ base::CheckAdd(xoffset, width).AssignIfValid(&max_x) &&
+ base::CheckAdd(yoffset, height).AssignIfValid(&max_y) &&
+ base::CheckAdd(zoffset, depth).AssignIfValid(&max_z) &&
+ max_x <= info.width && max_y <= info.height && max_z <= info.depth;
}
return false;
}