Index: mojo/public/cpp/bindings/lib/array_internal.h |
diff --git a/mojo/public/cpp/bindings/lib/array_internal.h b/mojo/public/cpp/bindings/lib/array_internal.h |
index 28a0a0d8d6accd24b7a4baf4c3d442260c82f373..99991c5c862b3035168496acc28d1c24a522e91e 100644 |
--- a/mojo/public/cpp/bindings/lib/array_internal.h |
+++ b/mojo/public/cpp/bindings/lib/array_internal.h |
@@ -12,6 +12,7 @@ |
#include "mojo/public/cpp/bindings/lib/bindings_serialization.h" |
#include "mojo/public/cpp/bindings/lib/bounds_checker.h" |
#include "mojo/public/cpp/bindings/lib/buffer.h" |
+#include "mojo/public/cpp/bindings/lib/validation_errors.h" |
namespace mojo { |
template <typename T> class Array; |
@@ -183,10 +184,12 @@ struct ArraySerializationHelper<P*, false> { |
const ElementType* elements, |
BoundsChecker* bounds_checker) { |
for (uint32_t i = 0; i < header->num_elements; ++i) { |
- if (!ValidateEncodedPointer(&elements[i].offset) || |
- !P::Validate(DecodePointerRaw(&elements[i].offset), bounds_checker)) { |
+ if (!ValidateEncodedPointer(&elements[i].offset)) { |
+ ReportValidationError(VALIDATION_ERROR_ILLEGAL_POINTER); |
return false; |
} |
+ if (!P::Validate(DecodePointerRaw(&elements[i].offset), bounds_checker)) |
+ return false; |
} |
return true; |
} |
@@ -211,17 +214,24 @@ class Array_Data { |
static bool Validate(const void* data, BoundsChecker* bounds_checker) { |
if (!data) |
return true; |
- if (!IsAligned(data)) |
+ if (!IsAligned(data)) { |
+ ReportValidationError(VALIDATION_ERROR_MISALIGNED_OBJECT); |
return false; |
- if (!bounds_checker->IsValidRange(data, sizeof(ArrayHeader))) |
+ } |
+ if (!bounds_checker->IsValidRange(data, sizeof(ArrayHeader))) { |
+ ReportValidationError(VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE); |
return false; |
+ } |
const ArrayHeader* header = static_cast<const ArrayHeader*>(data); |
if (header->num_bytes < (sizeof(Array_Data<T>) + |
Traits::GetStorageSize(header->num_elements))) { |
+ ReportValidationError(VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER); |
return false; |
} |
- if (!bounds_checker->ClaimMemory(data, header->num_bytes)) |
+ if (!bounds_checker->ClaimMemory(data, header->num_bytes)) { |
+ ReportValidationError(VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE); |
return false; |
+ } |
const Array_Data<T>* object = static_cast<const Array_Data<T>*>(data); |
return Helper::ValidateElements(&object->header_, object->storage(), |