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: I41093b6d168ce131f36739d6937b8518b0eb6cb2
Reviewed-on: https://chromium-review.googlesource.com/c/1408031
Commit-Queue: Zhenyao Mo <zmo@chromium.org>
Reviewed-by: Antoine Labour <piman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#624329}
diff --git a/gpu/command_buffer/build_cmd_buffer_lib.py b/gpu/command_buffer/build_cmd_buffer_lib.py
index 9dfe7be4..2e73406 100644
--- a/gpu/command_buffer/build_cmd_buffer_lib.py
+++ b/gpu/command_buffer/build_cmd_buffer_lib.py
@@ -2209,11 +2209,10 @@
def WriteGetDataSizeCode(self, func, arg, f):
"""Overrriden from TypeHandler."""
code = """ uint32_t %(data_size)s;
- if (!%(namespace)sSafeMultiplyUint32(n, sizeof(GLuint), &%(data_size)s)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&%(data_size)s)) {
return error::kOutOfBounds;
}
-""" % {'data_size': arg.GetReservedSizeId(),
- 'namespace': _Namespace()}
+""" % {'data_size': arg.GetReservedSizeId()}
f.write(code)
def WriteHandlerImplementation (self, func, f):
@@ -2662,11 +2661,10 @@
def WriteGetDataSizeCode(self, func, arg, f):
"""Overrriden from TypeHandler."""
code = """ uint32_t %(data_size)s;
- if (!%(namespace)sSafeMultiplyUint32(n, sizeof(GLuint), &%(data_size)s)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&%(data_size)s)) {
return error::kOutOfBounds;
}
-""" % {'data_size': arg.GetReservedSizeId(),
- 'namespace': _Namespace()}
+""" % {'data_size': arg.GetReservedSizeId()}
f.write(code)
def WriteGLES2ImplementationUnitTest(self, func, f):
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index ceb31c28..a5ca58f 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -2117,7 +2117,8 @@
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;
}
@@ -4897,7 +4898,10 @@
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;
@@ -6099,7 +6103,11 @@
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)) {
@@ -6852,7 +6860,8 @@
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;
}
@@ -6917,13 +6926,15 @@
}
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;
}
@@ -7013,7 +7024,7 @@
}
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;
}
@@ -7023,13 +7034,15 @@
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/gpu/command_buffer/common/gles2_cmd_utils.cc b/gpu/command_buffer/common/gles2_cmd_utils.cc
index 8cc28ef..e3a0a8ec 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils.cc
+++ b/gpu/command_buffer/common/gles2_cmd_utils.cc
@@ -608,7 +608,8 @@
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;
@@ -616,7 +617,8 @@
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;
}
}
@@ -686,8 +688,8 @@
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 {
@@ -695,42 +697,28 @@
}
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) {
@@ -740,7 +728,7 @@
*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/gpu/command_buffer/common/gles2_cmd_utils.h b/gpu/command_buffer/common/gles2_cmd_utils.h
index 7346133..25a28052 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils.h
+++ b/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();
-}
-
// A 32-bit and 64-bit compatible way of converting a pointer to a
// 32-bit usigned integer, suitable to be stored in a GLuint.
inline uint32_t ToGLuint(const void* ptr) {
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc b/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc
index 459e39e..993d6e6a 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc
+++ b/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc
@@ -21,58 +21,6 @@
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/gpu/command_buffer/service/buffer_manager.cc b/gpu/command_buffer/service/buffer_manager.cc
index 3b710450..979ed2d 100644
--- a/gpu/command_buffer/service/buffer_manager.cc
+++ b/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 @@
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 @@
}
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;
}
@@ -908,10 +904,10 @@
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/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index df1798ff8..97b7598 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4538,7 +4538,8 @@
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))
@@ -4564,7 +4565,8 @@
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);
@@ -10602,7 +10604,8 @@
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;
@@ -10719,7 +10722,7 @@
// 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 =
@@ -10738,19 +10741,14 @@
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");
@@ -12584,7 +12582,8 @@
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;
}
@@ -12729,7 +12728,8 @@
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;
}
@@ -13869,7 +13869,8 @@
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) {
@@ -14533,7 +14534,7 @@
// 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;
@@ -14631,7 +14632,7 @@
// 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;
@@ -16108,7 +16109,7 @@
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*>(
@@ -17533,8 +17534,9 @@
// 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;
@@ -19227,7 +19229,8 @@
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;
}
@@ -19262,7 +19265,7 @@
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;
}
@@ -19442,7 +19445,8 @@
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/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index ff95e670..912d5b30 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -739,7 +739,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t buffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &buffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&buffers_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* buffers = GetImmediateDataAs<volatile const GLuint*>(
@@ -759,7 +759,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t framebuffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &framebuffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&framebuffers_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* framebuffers =
@@ -780,7 +780,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t renderbuffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &renderbuffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&renderbuffers_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* renderbuffers =
@@ -803,7 +803,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t samplers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &samplers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&samplers_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* samplers = GetImmediateDataAs<volatile const GLuint*>(
@@ -834,7 +834,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t textures_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &textures_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&textures_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* textures = GetImmediateDataAs<volatile const GLuint*>(
@@ -857,7 +857,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t ids_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &ids_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&ids_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* ids = GetImmediateDataAs<volatile const GLuint*>(
@@ -1111,7 +1111,7 @@
*static_cast<const volatile gles2::cmds::GenBuffersImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t buffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &buffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&buffers_size)) {
return error::kOutOfBounds;
}
volatile GLuint* buffers = GetImmediateDataAs<volatile GLuint*>(
@@ -1151,7 +1151,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t framebuffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &framebuffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&framebuffers_size)) {
return error::kOutOfBounds;
}
volatile GLuint* framebuffers = GetImmediateDataAs<volatile GLuint*>(
@@ -1177,7 +1177,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t renderbuffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &renderbuffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&renderbuffers_size)) {
return error::kOutOfBounds;
}
volatile GLuint* renderbuffers = GetImmediateDataAs<volatile GLuint*>(
@@ -1204,7 +1204,7 @@
*static_cast<const volatile gles2::cmds::GenSamplersImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t samplers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &samplers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&samplers_size)) {
return error::kOutOfBounds;
}
volatile GLuint* samplers = GetImmediateDataAs<volatile GLuint*>(
@@ -1229,7 +1229,7 @@
*static_cast<const volatile gles2::cmds::GenTexturesImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t textures_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &textures_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&textures_size)) {
return error::kOutOfBounds;
}
volatile GLuint* textures = GetImmediateDataAs<volatile GLuint*>(
@@ -1257,7 +1257,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t ids_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &ids_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&ids_size)) {
return error::kOutOfBounds;
}
volatile GLuint* ids =
@@ -4448,7 +4448,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t queries_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &queries_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&queries_size)) {
return error::kOutOfBounds;
}
volatile GLuint* queries = GetImmediateDataAs<volatile GLuint*>(
@@ -4474,7 +4474,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t queries_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &queries_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&queries_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* queries = GetImmediateDataAs<volatile const GLuint*>(
@@ -4566,7 +4566,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t arrays_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &arrays_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&arrays_size)) {
return error::kOutOfBounds;
}
volatile GLuint* arrays =
@@ -4592,7 +4592,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t arrays_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &arrays_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&arrays_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* arrays = GetImmediateDataAs<volatile const GLuint*>(
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc
index 3925efb..7d7e982 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc
@@ -958,7 +958,7 @@
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/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
index 022e81f..2339a57a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
@@ -573,7 +573,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t buffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &buffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&buffers_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* buffers = GetImmediateDataAs<volatile const GLuint*>(
@@ -596,7 +596,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t framebuffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &framebuffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&framebuffers_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* framebuffers =
@@ -633,7 +633,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t renderbuffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &renderbuffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&renderbuffers_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* renderbuffers =
@@ -659,7 +659,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t samplers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &samplers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&samplers_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* samplers = GetImmediateDataAs<volatile const GLuint*>(
@@ -710,7 +710,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t textures_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &textures_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&textures_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* textures = GetImmediateDataAs<volatile const GLuint*>(
@@ -737,7 +737,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t ids_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &ids_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&ids_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* ids = GetImmediateDataAs<volatile const GLuint*>(
@@ -957,7 +957,7 @@
*static_cast<const volatile gles2::cmds::GenBuffersImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t buffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &buffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&buffers_size)) {
return error::kOutOfBounds;
}
volatile GLuint* buffers = GetImmediateDataAs<volatile GLuint*>(
@@ -993,7 +993,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t framebuffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &framebuffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&framebuffers_size)) {
return error::kOutOfBounds;
}
volatile GLuint* framebuffers = GetImmediateDataAs<volatile GLuint*>(
@@ -1016,7 +1016,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t renderbuffers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &renderbuffers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&renderbuffers_size)) {
return error::kOutOfBounds;
}
volatile GLuint* renderbuffers = GetImmediateDataAs<volatile GLuint*>(
@@ -1040,7 +1040,7 @@
*static_cast<const volatile gles2::cmds::GenSamplersImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t samplers_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &samplers_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&samplers_size)) {
return error::kOutOfBounds;
}
volatile GLuint* samplers = GetImmediateDataAs<volatile GLuint*>(
@@ -1062,7 +1062,7 @@
*static_cast<const volatile gles2::cmds::GenTexturesImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t textures_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &textures_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&textures_size)) {
return error::kOutOfBounds;
}
volatile GLuint* textures = GetImmediateDataAs<volatile GLuint*>(
@@ -1087,7 +1087,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t ids_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &ids_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&ids_size)) {
return error::kOutOfBounds;
}
volatile GLuint* ids =
@@ -3781,7 +3781,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t queries_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &queries_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&queries_size)) {
return error::kOutOfBounds;
}
volatile GLuint* queries = GetImmediateDataAs<volatile GLuint*>(
@@ -3804,7 +3804,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t queries_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &queries_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&queries_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* queries = GetImmediateDataAs<volatile const GLuint*>(
@@ -3865,7 +3865,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t arrays_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &arrays_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&arrays_size)) {
return error::kOutOfBounds;
}
volatile GLuint* arrays =
@@ -3888,7 +3888,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t arrays_size;
- if (!SafeMultiplyUint32(n, sizeof(GLuint), &arrays_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&arrays_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* arrays = GetImmediateDataAs<volatile const GLuint*>(
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc
index dead18b7..e12449c 100644
--- a/gpu/command_buffer/service/raster_decoder.cc
+++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -1761,8 +1761,8 @@
// 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/gpu/command_buffer/service/raster_decoder_autogen.h b/gpu/command_buffer/service/raster_decoder_autogen.h
index c0e399e..f4b23b0 100644
--- a/gpu/command_buffer/service/raster_decoder_autogen.h
+++ b/gpu/command_buffer/service/raster_decoder_autogen.h
@@ -46,7 +46,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t queries_size;
- if (!gles2::SafeMultiplyUint32(n, sizeof(GLuint), &queries_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&queries_size)) {
return error::kOutOfBounds;
}
volatile GLuint* queries = gles2::GetImmediateDataAs<volatile GLuint*>(
@@ -72,7 +72,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t queries_size;
- if (!gles2::SafeMultiplyUint32(n, sizeof(GLuint), &queries_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&queries_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* queries =
@@ -216,7 +216,7 @@
DeletePaintCacheTextBlobsINTERNALImmediate*>(cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t ids_size;
- if (!gles2::SafeMultiplyUint32(n, sizeof(GLuint), &ids_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&ids_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* ids =
@@ -238,7 +238,7 @@
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t ids_size;
- if (!gles2::SafeMultiplyUint32(n, sizeof(GLuint), &ids_size)) {
+ if (!base::CheckMul(n, sizeof(GLuint)).AssignIfValid(&ids_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* ids =
diff --git a/gpu/command_buffer/service/renderbuffer_manager.cc b/gpu/command_buffer/service/renderbuffer_manager.cc
index da6e876..43c42038 100644
--- a/gpu/command_buffer/service/renderbuffer_manager.cc
+++ b/gpu/command_buffer/service/renderbuffer_manager.cc
@@ -291,21 +291,13 @@
int internal_format,
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/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc
index f0d0b07..b433f0ac 100644
--- a/gpu/command_buffer/service/texture_manager.cc
+++ b/gpu/command_buffer/service/texture_manager.cc
@@ -1329,18 +1329,12 @@
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;
}